2010-09-01 35 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。