2011-11-20 30 views
0

我想为我的应用程序设置进度栏。如何在后台繁忙时使用进度条

我正在使用背景从我的服务器下载一些文件。

这将是很好,如果我设置一个进度条。

我知道使用

ProgressBar.Value = 5; 

多。

但我想用进度条。'

我使用进度条

private void bgDownload_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    this.downloadProgressBar.Value = e.ProgressPercentage; 
} 

,但它不工作的代码。

任何人都可以说我该怎么做。

在此先感谢

回答

1

如果你在后台做处理,用户界面将不会更新,直到它结束了。

所以你需要做的是创建一个独立的线程,处理将发生在该线程内更新进度条。在主线程中不要做任何事情。

要更新另一个线程中的进度条,您需要一个委托(否则您会得到一个运行时错误)。

希望这可以让你开始。

+0

u能请给我提供somecode,因为我不知道进度条,我刚才看到它 –

+0

这是不正确。如果他在后台执行此操作(不同的线程),则只要使用BeginInvoke或BackGroundWorker进度更改事件将值传递给UI,UI就会更新。 – tsells

0

您可以尝试使用BackgroundWorker下载一些文件。

因此,后台下载不会影响您的进程栏。

private void btnDownLoad_Click(System.Object sender, 
     System.EventArgs e) 
    { 

     // Start the asynchronous operation. 
     backgroundWorkerDownLoadFile.RunWorkerAsync(); 
    } 



    private void backgroundWorkerDownLoadFile_DoWork(object sender, 
     DoWorkEventArgs e) 
    { 
     // Get the File in Server. 
    } 
0

我假设您使用的是后台工作组件。所以,你必须从DoWork方法中调用ReportProgress backgroundworker的方法,它应该更新进度条。请在下面找到从MSDN上ReportProgress方法有一定的参考:

http://msdn.microsoft.com/en-us/library/ka89zff4.aspx

0

除了什么JKhuang写的,改变你的进度条的值,你就需要添加 委托和回调函数

delegate void SetProgCallback(int newVal); 
private void SetProgressbarValue(int newVal) 
{ 
    if (progbar.InvokeRequired) 
    { 
     SetProgCallback d = SetProgressbarValue; 
     Invoke(d, new object[] { newVal }); 
    } 
    else 
    { 
     //insert your actual code here 
    } 
} 
+0

或者你可以使用Action <>来代替委托。 progbar.Invoke(new Action (SetProgressbarValue,new object [] {newVal})); – Alex

0

这是一个如何做到这一点的例子。

public int ProgressBarPercentage { get; set; } 
    public string StatusMessage { get; set; } 

    public void StartDownload() 
    { 
     BackgroundWorker bw = new BackgroundWorker(); 
     bw.WorkerReportsProgress = true; 
     bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged); 
     bw.DoWork += new DoWorkEventHandler(bw_DoWork); 
     bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted); 
     bw.RunWorkerAsync(); 
    } 

    void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     // Run clean up code here once complete (ie make sure progress bar is at 100 percent.... 
    } 

    void bw_DoWork(object sender, DoWorkEventArgs e) 
    { 
     BackgroundWorker bw = sender as BackgroundWorker; 

     // Download files here 
     List<string> filestoget = new List<string>(); 
     filestoget.Add("File1"); 
     filestoget.Add("File2"); 
     filestoget.Add("File3"); 
     filestoget.Add("File4"); 
     filestoget.Add("File5"); 

     foreach (string file in filestoget) 
     { 
      // Get File 

      // Report output 
      int progress = 0; // add soemthing here to calculate your progress 
      bw.ReportProgress(progress, string.Format("File {0} downloaded", file)); 
     } 
    } 

    void bw_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     ProgressBarPercentage = e.ProgressPercentage; 
     StatusMessage = e.UserState.ToString(); 
    } 
相关问题