2012-07-24 82 views
1

目前我正在從事一個項目,需要消耗大量的數據從web服務, 有服務類發送輸入日期到服務器,並得到結果, 由於它耗時過程中,需要用戶組合進度條和背景工作程序來向用戶顯示過程百分比。我已經瀏覽了很多關於這個主題的示例代碼,但仍然無法找出實現它的最佳方式。請你幫忙,我 代碼以下,C進度條和backgroundworker#

private MyCollection[] callWebService(string[] Inputs, string method) 
{ 
    List<string> results = new List<string>(); 
    string fiel dNames = ""; // todo - fix this if nothing left in loop 
    int sizeOfArray = 500; 
    for (int i = 0; i < Inputs.Length; i = i + sizeOfArray) 
    { 
     string[] outputRecords; 
     int errorCode; 
     string errorString; 
     string[] thisFiveHundred = createSubArray(Inputs, i, sizeOfArray); 


     iq.NameValuePair[] namevaluepairs = new iq.NameValuePair[0]; 
     fieldNames = iqOfficeWebservice.BatchStan(method, thisFiveHundred, null, "",  out outputRecords, out errorCode, out errorString); 
     results.AddRange(outputRecords); 
    } 
    results.ToArray(); 
    IAddress[] formattedResults = convertStringsToInputs(fieldNames, results); 
    return formattedResults; 
} 

回答

8
private void cmdButton_Click(object sender, EventArgs e) 
    { 
     BackgroundWorker worker = new BackgroundWorker(); 
     worker.WorkerReportsProgress = true; 
     worker.DoWork += new DoWorkEventHandler(worker_DoWork); 
     worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged); 
     worker.RunWorkerAsync(); 
    } 

    private void worker_DoWork(object sender, DoWorkEventArgs e) 
    { 
     BackgroundWorker worker = sender as BackgroundWorker; 

     for (int i = 0; i < 101; i++) 
     { 
      worker.ReportProgress(i); 
      System.Threading.Thread.Sleep(1000); 
     } 
    } 

    private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     lblProgress.Text = ("Progress: " + e.ProgressPercentage.ToString() + "%"); 
    } 

附加信息可以發現here

+0

是的,我知道進度條演示,但我們可以把conter連接到worker_Dowork和myCollection?我應該在myCollection中添加一個計數器並將計數器傳遞給worker_Dowork?對不起,也許我有點沉悶,我只是不能將演示鏈接到實際的工作方法。 – 2012-07-24 05:08:01

+0

您應該編寫從_DoWork中的數據庫讀取的代碼,並且更新進度取決於行計數。然後在_RunWorkerCompleted事件中獲取您的數據。替換System.Threading.Thread.Sleep(1000);與您的代碼 – 2012-07-24 06:20:22

1

除了WPF或Winforms中的技術實現之外,還有一個重要方面需要考慮。

  • 您是否從Web服務獲得了進度反饋?

如果不是,您很可能無法正確預測Web服務需要的時間。這將取決於您無法影響的因素(如服務器負載,網絡流量等)。在這種情況下,不推薦進度條,因爲它會給用戶帶來奇怪的體驗。

然後,您可以選擇顯示文本信息,請求可能需要幾分鐘時間,並使用IsIndeterminate標誌集(WPF)顯示進度以顯示持續進度反饋。因爲您正在使用後臺線程,所以不能使用沙盤光標。

另一種方法是將大的請求分解爲可報告進度的較小部分。

1

我剛剛彙集了Adil的答案的變體,它封裝了工作和更新,以及正確地分離事件和處理工作人員。如果你投了我的電話,請提出Adil的答案。

private void cmdButton_Click(object sender, EventArgs e) 
    { 
     var worker = new BackgroundWorker(); 
     worker.WorkerReportsProgress = true; 

     DoWorkEventHandler doWork = (dws, dwe) => 
     { 
      for (int i = 0; i < 101; i++) 
      { 
       worker.ReportProgress(i); 
       System.Threading.Thread.Sleep(100); 
      } 
     }; 

     ProgressChangedEventHandler progressChanged = (pcs, pce) => 
     { 
      lblProgress.Text = String.Format("Progress: {0}%", pce.ProgressPercentage); 
     }; 

     RunWorkerCompletedEventHandler runWorkerCompleted = null; 
     runWorkerCompleted = (rwcs, rwce) => 
     { 
      worker.DoWork -= doWork; 
      worker.ProgressChanged -= progressChanged; 
      worker.RunWorkerCompleted -= runWorkerCompleted; 
      worker.Dispose(); 
      lblProgress.Text = "Done."; 
     }; 

     worker.DoWork += doWork; 
     worker.ProgressChanged += progressChanged; 
     worker.RunWorkerCompleted += runWorkerCompleted; 

     worker.RunWorkerAsync(); 
    }