2010-09-01 38 views
0

*注意:根据用户的意见改述我的问题。Needwork on Backgroundworker

需要关于如何使用.Net的Backgroundworker线程来达到以下目的的帮助,以提高我在.Net winforms应用程序中的UI响应和性能。 当用户点击“计算”在UI形式按钮,我这样做:

1.Get从数据库C类的列表[这通常为约10]

2.对于每个类别C,请执行以下操作:

a。调用第三方库,进行一些处理并计算类别价格。

b。获取产品清单[这通常在800左右]。

c。对于每个产品,使用上面的类别价格计算其价格。

d。使用存储的过程将每个产品的这个价格更新回数据库中。

3.将进度更新回UI [或报告任何错误消息]到UI中的表单。

仅供参考,我想使用Backgroundworker进行上述步骤#c和#d。

我试着在我的方法中使用Backgroundworker。我把调用InitializeBackgroundworker()和RunWorkerAsync()放在最外层的循环[即。步骤2]。但看起来像Backgroundworker只是为第一个类别调用。我在这里错过了什么?

所以我的问题是,我在哪里调用InitializeBackgroundworker()和RunWorkerAsync()? 我该如何确保这两种方法可以针对每个类别进行调用?

感谢您的阅读。

+0

我可以想到几个地方看 - 你可以发布主循环的代码? – egrunin 2010-09-02 19:17:04

回答

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。