2012-04-10 50 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

実際のコードをすべて見ずに答えるのは難しいです。 –

+0

ところで、ソースコード改訂管理システムを使用しますか? –

+0

@MitchWheat:大きなプロジェクトなので、それを見ても答えにくいです。私は問題を切り分けるために何を切ることができるのかよくわからないし、全体を見過ぎて人々に見てもらうのは大変だ。 Re:ソースコード、はい、私は最後の作業コードに戻ることができると思いますが、私は本当にそれに触れていませんでしたので、問題は何とか環境にあると思われます。 –

答えて

0

私は本当にここで何が起こっているのか分かりませんが、問題を解決する方法を見つけました。私はOnDoWorkルーチン空を残した場合:

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

それが呼ばれることになる、と私はそこに基本的な枠組みのものを置けば、それはとも呼ばれます。しかし、次のような行を追加するとすぐに:

Dim result = AnotherLibrary.SomeMethod() 

このルーチンは呼び出されません。私はAnotherLibraryのプロジェクトを見て、私も同様にCompile TabTarget 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ターゲットに関連する問題であったようです(私の答えを見てください)。あなたは何が起こっているか考えていますか? –

+0

CPUターゲットが間違っていると、例外を生成する良い方法です。出力ウィンドウで、デバッガからの「ファーストチャンス例外」通知を確認します。 –

0

私は同様の問題に関していくつかの答えを得ました。私のプロジェクト(c#-wpf stuff)、マネージオブジェクトを持つC++コードのラッパーにいくつかのdllを追加しようとすると、2番目のものが使用されたときに同じ問題が発生します。

私の場合、2つのライブラリが同じライブラリ(バージョンXX.4.1とXX.3.2)の場合、別のインスタンスを使用していたためです。両方のライブラリを同じものでコンパイルすると、すべてが機能しました。

関連する問題