0

次のように機能する長時間実行操作用のジョブオブジェクトがあります。

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()

これは1年前はうまくいきました、そして私は他のことに移りました。今日はこのコードに戻らなければなりませんでしたが、今実行すると、OnDoWorkオーバーライドは呼び出されません。そこにあるブレークポイントはヒットせず、デバッグメッセージは書き込まれず、メソッドは単に呼び出されず、エラーはどこにもスローされません。

低レベルのフレームワークのように見えるので、これを引き起こす可能性のある変更が何であったかは考えられません。アプリの残りの部分は正常に読み込まれて実行され、メインウィンドウに表示され(WPFアプリです)、ボタンクリックイベントが発生します。起動しないのはバックグラウンドスレッドメソッドだけです。ここで何が起こっているのでしょうか?

4

3 に答える 3

2

BackgroundWorkerを使用する際のよくある間違い。例外をチェックするのを忘れていることは間違いありません。コードを明示的に記述しないと、診断なしで完全に飲み込まれてしまいます。修理:

Protected Overrides Sub OnRunWorkerCompleted(ByVal e As RunWorkerCompletedEventArgs)
    If e.Error IsNot Nothing Then Throw e.Error
    MyBase.OnRunWorkerCompleted(e)
End Sub
于 2012-04-11T12:46:26.583 に答える
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そしてそれは問題を修正しました。しかし、それが実際に何を意味するのか、そしてなぜそれがこの問題を引き起こしたのかを知りたいのです。

于 2012-04-11T12:35:12.197 に答える
0

同様の問題に関して、私はいくつかの答えを得ました。プロジェクト(c#-wpfのもの)にいくつかのdllを追加しようとすると、管理対象オブジェクトを含むc ++コードのラッパーであり、2番目のdllが使用されたときに同じ問題に気付きます。

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

于 2012-11-15T18:07:59.867 に答える