2011-11-20 29 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(); 
    } 
相關問題