2013-03-12 154 views
0

我有一個C#項目(.NET 3.5),它使用BackgroundWorker來做一些事情。 這東西爲它執行的所有操作寫一個日誌文件。當完成BackgroundWorker 時,我需要檢索日誌文件中的一些信息。問題是 當RunWorkerCompleted事件被觸發時,日誌文件仍然是空的。所以,如果我做到以下幾點:C#在BackgroundWorker後執行一些操作RunWorker完成完成

private void BackProgress_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
     LoadLog(); 

} 

LoadLog方法,會發現一個空的日誌。

我一直在調試應用程序,我發現日誌文件在RunWorkerCompleted最後一個花括號被擊中的時刻不再是空的。我不知道如何在適當的時候加載日誌文件,因爲在RunWorkerAsync()調用之後我立即執行的任何操作都會立即執行,並且BackgroundWorker的工作仍然無法完成(再次爲空日誌)。

基本上我需要能夠在RunWorkerCompleted方法達到其結束後調用LoadLog

你有什麼想法可以幫助我解決這個問題嗎?

感謝提前:)

+0

你能向我們展示了'DoWork'處理程序是什麼樣子? – Caramiriel 2013-03-12 21:32:56

+3

這幾乎聽起來像是一個日誌刷新問題,也許看看你正在使用的任何日誌系統,看看是否有刷新調用或自動刷新或什麼。 – WildCrustacean 2013-03-12 21:33:22

+0

您可以將代碼放入工作線程中,您可以使用true/false標誌來指示工作線程何時完成。如果您仍然擁有該線程的句柄,則可以在嘗試讀取之前檢查該線程是否處於活動狀態。如果文件已打開,那麼它將被鎖定,您也可以檢查該文件。 – Sorceri 2013-03-12 21:33:32

回答

0

你可以嘗試控制/表BeginInvoke方法異步調用LoadLog。

該方法使用PostMessage在Windows消息隊列中放置註冊消息並立即返回 - 這就是它如何進行異步調用。

像這樣:

BeginInvoke(new MethodInvoker(LoadLog)); 
+0

這是我第二次做這件事的作品。問題是,它應該從第一次開始工作(沒有人想發送重複的電子郵件)。在添加此代碼之前,第一次未加載日誌,然後加載第二個日誌,第三個日誌未加載,依此類推。現在它每次從第二個開始加載。不過,重要的是第一個。 :/ – 2013-03-12 21:53:50

+0

第一次發生什麼?日誌是否爲空?第一次運行後,日誌何時不爲空?對不起,我試圖理解這個問題。 – 2013-03-12 22:55:07

+0

沒關係。第一次日誌是空的,因爲(據我所知)在bw完成之前調用LoadLog方法。當runworkercomplete中的最後一個大括號被傳遞時,日誌停止爲空。 – 2013-03-12 23:09:29

相關問題