*注意:根据用户的评论重新提出我的问题。
需要有关如何使用.Net的Backgroundworker线程的帮助,以实现以下目的,以提高我的.Net winforms应用程序中的UI响应能力和性能。 当用户在UI表单中单击“计算”按钮时,我这样做:
1.从数据库中获取类别C的列表[通常大约为10]
2.对于每个C类,请执行以下操作:
a。拨打第三方库,进行一些处理并计算类别价格。
b。获取产品清单[通常约为800]。
c。对于每种产品,使用上面的类别价格计算其价格。
d。使用存储过程将数据库中的每个产品的价格更新回来。
3.将进度更新[或报告任何错误消息]到UI中的表单。
仅供参考,我想将Backgroundworker用于上面的步骤#c和#d。
我尝试在我的方法中使用Backgroundworker。我在最外层循环中调用InitializeBackgroundworker()和RunWorkerAsync()[即。第2步]。但是看起来,Backgroundworker只是为第一类调用了。我在这里想念的是什么?
所以我的问题是,我在哪里调用InitializeBackgroundworker()和RunWorkerAsync()? 我如何确保为每个类别调用这两种方法?
感谢阅读。
答案 0 :(得分:1)
答案 1 :(得分:1)
首先尝试这样的事情。
BackgroundWorker worker = new BackgroundWorker();
void SomeForm_Load(object sender, EventArgs e)
{
// setup the BackgroundWorker
worker.WorkerReportsProgress = true;
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_Completed);
}
void SomeControl_Click(object sender, EventArgs e)
List<Category> categories = DataBase.GetSomeCategories(); // [1] get Category list
// start the BackgroundWorker passing in the categories list.
worker.RunWorkerAsync(categories);
}
void worker_DoWork(object sender, DoWorkEventArgs e)
{
int progress = 0;
var categories = e.Argument as List<Category>;
categories.ForEach(category => // [2] process each Category
{
ThirdPartyControl.DoSomeProcessing(category); // [2.a]
var categoryPrice = CalculateCategoryPrice(category);
var products = GetListOfProducts(category); // [2.b]
products.ForEach(product => // [2.c] process each Product
{
var productPrice = CalcProductPrice(categoryPrice);
DataBase.UpdateProduct(product, productPrice); // [2.d]
progress = //...calculate progress...
worker.ReportProgress(progress); // [3]
});
progress = //...calculate progress...
worker.ReportProgress(progress); // [3]
});
worker.ReportProgress(100);
}
void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
//...update some UI stuff...
progressBar.Value = e.ProgressPercentage;
}
void worker_Completed(object sender, RunWorkerCompletedEventArgs e)
{
//...all done...
}
随着您的理解增加,您可以随时将其分解为多个BackgroundWorkers。