2013-08-29 125 views
0

我在開發.net網絡應用程序很長時間的經驗,但今天我被要求創建一個Windows窗體應用程序來創建基於數據庫的一些數據的Excel和我不是Windows窗體上的專家。BackgroundWorker創建excel,需要根據奇/偶寄存器風格化

它的完成和工作。我使用後臺工作人員添加了一個進度條,所以程序可以繼續響應,現在我想根據其OrderId更改該行的bgcolor。

我增加了以下內容:

backgroundColor = backgroundColor == Color.White ? Color.WhiteSmoke : Color.White; 

這行代碼是正確的波紋管我的訂單的foreach,我的訂單可能有很多支付等等,所以它會像對excel多行只是一個訂購。

沒有BackgroundWorker,所有的東西都像我想的那樣工作,但是,添加它會混亂一切,因爲它在一個線程中發生了一些奇怪的事情。

我希望我能讓自己變得非常清楚,也希望能爲這個「問題」找到答案。

下面是BackgroundWorker的代碼,這CreateExcel方法裏面有訂單一個foreach,但BackgroundWorker的螺紋和我着色的bgcolor爲每個不同的順序邏輯是不工作...

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 
    Util.CreateExcel(_orders, _fileName, sender as BackgroundWorker, e); 
} 

我嘗試發佈一些圖片,但我需要更多的聲譽。

所需結果類似'斑馬',每個訂單都有不同的bgcolor。如果沒有backgroudworker,這可以正常工作,但結果很奇怪,有些訂單與其他訂單具有相同的bgcolor,並且一些訂單沒有問題。

+1

「某事發生怪異」是不足夠。什麼具體出錯了? – Haney

+0

進出口可怕對不起....問題是,行被錯誤地着色,像orderid 1應該是白色的兩條線,只有1是白色的,另一個是灰色的。我想讓奇數/偶數在excel上爲每個訂單着色bgcolor。 –

+0

你能提供一個線程代碼嗎? – Haney

回答

0

您可能具有在彩色切換代碼的​​競爭條件:

backgroundColor = backgroundColor == Color.White ? Color.WhiteSmoke : Color.White; 

該代碼是類似於:

if(backgroundColor == Color.White) 
     backgroundColor = Color.WhiteSmoke; 
else 
     backgroundColor = Color.White; 

兩個,或更多,線程可行走同時通過如果代碼爲及其條件,那麼您可能有兩個線程正在測試,並意識到背景現在是白色,並且完全是同一時間,這將產生兩個WhiteSmoke行。

解決這個問題的方法是隻允許一個線程來執行該塊中,排他地,通過鎖定一個共享對象(在一個場中,例如):

lock(syncLock) 
{ 
    backgroundColor = backgroundColor == Color.White ? Color.WhiteSmoke : Color.White; 
}