将控制台转换为Winforms.如何实现两个进度条与后台工作者

本文关键字:两个 工作者 后台 实现 转换 控制台 Winforms 何实现 | 更新日期: 2023-09-27 18:17:45

我有一个非常简单的WinForms应用程序,它使用类从一些web服务收集国家和地区,并将收集到的数据存储到文件中。这个CollectData类在控制台应用程序中工作完美,并通过控制台通知每个步骤。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(对象发送方,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关于内部类逻辑?

我在互联网上搜索,所有的例子都像简单的"for"循环在backgroundWorker_DoWork与线程。睡觉,但我有不同的情况。

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

将控制台转换为Winforms.如何实现两个进度条与后台工作者

一般信息

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

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

RunWorkerCompleted事件在后台worker完成时被引发,即当您的DoWork eventandler返回时。它在创建后台工作线程的线程上引发,通常意味着UI线程,可以用来更新UI控件。

最后,在调用ReportProgress方法时引发ProgressChanged事件。它也是在创建后台工作线程的同一个线程中引发的,你可以用它来更新UI。

示例代码

您应该将完成实际工作的代码放在backgroundWorker_DoWork方法中。代替调用Console.WriteLine,向用户反馈调用backgroundWorker.ReportProgress的进度。在backgroundWorker_ProgressChanged方法中,您可以更新进度条。