需要有关Backgroundworker的帮助

时间:2010-09-01 14:37:04

标签: c# multithreading backgroundworker

*注意:根据用户的评论重新提出我的问题。

需要有关如何使用.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()? 我如何确保为每个类别调用这两种方法?

感谢阅读。

2 个答案:

答案 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。