1

我有一个非常简单的 WinForms 应用程序,它使用从一些网络服务收集国家和地区并将收集的数据存储到文件中的类。这个 CollectData 类在控制台应用程序中完美运行,并通过 Console.WriteLine 通知每个步骤

我的代码如下所示:

    public class CollectData
    {
        public string OutputFile { get; private set; }

        public CollectData(string outputFile)
        {
            OutputFile = outputFile;
        }

    public void ProceedCollectingData()
    {
        Console.WriteLine("Getting countries...");

        List<string> countries = GetWorldCountries();
        foreach (string country in countries)
        {
            Console.WriteLine("Getting regions of country: " + country);

            List<string> regions = GetCountryRegions(country);
            AppendToFile(OutputFile, country, regions);
        }
    }

        private List<string> GetWorldCountries()
        {
            List<string> list = new List<string>();
            System.Threading.Thread.Sleep(20000); // here service fills list of countries.
            return list;
        }

        private List<string> GetCountryRegions(string country)
        {
            List<string> list = new List<string>();
            System.Threading.Thread.Sleep(20000); // here service fills list of regions.
            return list;
        }

        private void AppendToFile(string outputFile, string country, List<string> regions)
        {
            // Save everything into output file.
        }
    }

和 WinForm 代码:​​ private void btnCollectData_Click(object sender, EventArgs e) { CollectData collectData = new CollectData(tbOutputFile.Text.Trim()); collectData.ProceedCollectingData();

        //???? what should be here
        backgroundWorker.RunWorkerAsync(collectData);
    }

    private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        //???? what should be here?
    }

    private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        //???? what should be here?
    }

    private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        progressBarCountries.Value = 100;
        progressBarRegions.Value = 100;

        lblCurrentlyProgressingStatus.Text = "Done";
    }

什么是错的,我应该在我的类中改变什么,我应该打开什么,从类方法返回或重新开发,开发和通知 progressBars 内部类逻辑的正确方法是什么?

我在互联网上搜索,所有示例都像 backgroundWorker_DoWork 中带有 Thread.Sleep 的简单“for”循环,但我有不同的情况。

感谢任何澄清回复!谢谢!

4

1 回答 1

1

一般信息

BackgroundWorkers用于将工作委托给后台线程,因此 UI 线程不会被阻塞。

实际工作应该在DoWork事件的事件处理程序中进行。此事件是从后台工作线程调用的,因此您不得直接更新任何 UI 元素。

RunWorkerCompleted事件在后台工作人员完成时引发,即当您的DoWork事件处理程序返回时。它在创建后台工作线程的线程上引发,通常是指 UI 线程,可用于更新 UI 控件。

最后,当您调用ReportProgress方法时会引发ProgressChanged事件。它也在创建后台工作线程的同一线程上引发,您可以使用它来更新 UI。

您的示例代码

您应该将执行实际工作的代码放在backgroundWorker_DoWork方法中。而不是打电话Console.WriteLine给用户关于进度调用的反馈backgroundWorker.ReportProgress。在该backgroundWorker_ProgressChanged方法中,您可以更新进度条。

于 2013-06-08T18:17:42.917 回答