C#中的进度条和后台工作者

目前我正在开发一个需要从Web服务中消耗大量数据的项目。有服务类向服务器发送输入日期并返回结果,由于耗时的过程,需要用户组合进度条和后台工作者向用户显示进程百分比。 我已经浏览了很多关于这个主题的示例代码,但仍然无法找到最佳方法。 你能帮忙吗,我的代码是关注的,

private MyCollection[] callWebService(string[] Inputs, string method) { List results = new List(); 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; } 

  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() + "%"); } 

其他信息可以在这里找到。

除了WPF或Winforms中的技术实现之外,还有一个需要考虑的重要方面。

  • 您是否从Web服务获得了有关进度的反馈?

如果没有,您可能无法正确预测Web服务所需的时间。 这取决于您无法影响的因素(如服务器负载,网络流量等)。 在这种情况下,不建议使用进度条,因为它会给用户带来奇怪的体验。

然后,您可以选择显示请求可能需要几分钟的文本信息,并显示带有IsIndeterminate标志集(WPF)的进度以显示持续的进度反馈。 当您使用后台线程时,不能使用sandhour光标。

另一种方法是将大请求分解为可以报告进度的较小部分。

我刚刚汇总了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(); }