2012-04-10 57 views
0

我有長時間運行的操作的工作對象是這樣工作的:爲什麼BackgroundWorker.OnDoWork不被調用?

Class LongRunningJob 
    Inherits BackgroundWorker 

    Protected Overrides Sub OnDoWork(ByVal e As System.ComponentModel.DoWorkEventArgs) 
     'do long running job here 
    End Sub 
End Class 

我調用這個像這樣:

Dim job As New LongRunningJob 

    'run it 
    job.RunWorkerAsync() 

這一年多以前工作得很好,我轉移到其他的東西。我今天不得不返回到這個代碼,當我現在運行它時,OnDoWork覆蓋不會被調用。在那裏沒有中斷點,調試消息沒有被寫入,該方法根本不被調用,並且在任何地方都不會引發錯誤。

我想不出會發生什麼變化,可能會導致這種情況,因爲它看起來像一個低層框架的事情。應用程序的其餘部分加載並運行正常,主窗口顯示(這是一個WPF應用程序),並且按鈕單擊事件觸發。這只是後臺線程方法,不會觸發。這裏會發生什麼?

+0

很難回答,但沒有看到所有的實際代碼。 – 2012-04-10 23:37:22

+0

順便說一句,你使用源代碼修訂控制系統嗎? – 2012-04-10 23:55:02

+0

@MitchWheat:看到它也很難回答,因爲這是一個很大的項目。我不確定我可以分離出什麼來解決問題,整個事情會讓人們看太多。回覆:源代碼,是的,我想我可以回到上一個工作代碼,儘管我真的沒有觸及它,所以我懷疑問題是環境問題。 – 2012-04-11 00:07:25

回答

0

嗯,我想出瞭如何解決這個問題,雖然我不確定這裏發生了什麼。如果我離開了OnDoWork常規空:

Protected Overrides Sub OnDoWork(ByVal e As System.ComponentModel.DoWorkEventArgs) 
    'no code at all 
End Sub 

它會被調用,如果我把基本框架的東西在裏面,它也將被調用。但只要我添加這樣一行:

Dim result = AnotherLibrary.SomeMethod() 

該例程將不會被調用。我看了一下AnotherLibrary這個項目,也是我自己編寫的,看着Compile Tab,Target CPU下拉,看到它說的是x86。我將其更改爲Any CPU並解決了問題。但我仍然想知道這真正意味着什麼,以及它爲什麼導致了這個問題。

2

使用BackgroundWorker時常見的錯誤。你毫無疑問忘記檢查異常。如果你沒有明確地寫代碼,他們會被吞下整個沒有診斷。修復:

Protected Overrides Sub OnRunWorkerCompleted(ByVal e As RunWorkerCompletedEventArgs) 
    If e.Error IsNot Nothing Then Throw e.Error 
    MyBase.OnRunWorkerCompleted(e) 
End Sub 
+0

沒有任何例外,因爲代碼根本沒有運行。我把斷點放入,調試語句等等。這些代碼根本就沒有被調用。但它似乎是與CPU目標有關的問題(請參閱我的答案)。你知道那裏發生了什麼嗎? – 2012-04-11 15:15:42

+0

使CPU目標錯誤是生成異常的好方法。在輸出窗口中查找調試器發出的「第一次機會異常」通知。 – 2012-04-11 17:47:33

0

我得到了一些答案,關於類似的問題。試圖添加一些dll到我的項目(c#-wpf的東西),C++代碼與託管對象的包裝,我注意到同樣的問題,當第二個已被使用。

就我而言,這是因爲如果相同的庫(版本XX.4.1和XX.3.2),兩個庫使用不同的實例。編譯這兩個庫在同一個,一切工作。

相關問題