将控制台转换为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与线程。睡觉,但我有不同的情况。
感谢任何澄清回复!谢谢!
一般信息
BackgroundWorkers用于将工作委托给后台线程,这样UI线程就不会被阻塞。
实际的工作应该在DoWork事件的事件处理程序中进行。这个事件是从后台工作线程调用的,因此你不能直接更新任何UI元素。
RunWorkerCompleted事件在后台worker完成时被引发,即当您的DoWork
eventandler返回时。它在创建后台工作线程的线程上引发,通常意味着UI线程,可以用来更新UI控件。
最后,在调用ReportProgress方法时引发ProgressChanged事件。它也是在创建后台工作线程的同一个线程中引发的,你可以用它来更新UI。
示例代码
您应该将完成实际工作的代码放在backgroundWorker_DoWork
方法中。代替调用Console.WriteLine
,向用户反馈调用backgroundWorker.ReportProgress
的进度。在backgroundWorker_ProgressChanged
方法中,您可以更新进度条。