1

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

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;
}
4

3 回答 3

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

可以在此处找到其他信息。

于 2012-07-24T04:37:54.330 回答
1

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

  • 您是否从 Web 服务获得进度反馈?

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

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

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

于 2012-07-24T04:48:13.820 回答
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();
    }
于 2012-07-24T05:24:34.313 回答