2012-04-10 5 views
0

Ich habe ein Job-Objekt für lange laufende Operationen, die wie folgt funktioniert:Warum wird BackgroundWorker.OnDoWork nicht aufgerufen?

Class LongRunningJob 
    Inherits BackgroundWorker 

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

Und ich rufe dies wie folgt:

Dim job As New LongRunningJob 

    'run it 
    job.RunWorkerAsync() 

Das funktionierte vor einem Jahr in Ordnung, und ich zog nach anderen auf Dinge. Ich musste heute zu diesem Code zurückkehren, und wenn ich es jetzt ausführe, wird die OnDoWork Überschreibung einfach nicht aufgerufen. Ein Breakpoint dort wird nicht getroffen, Debugging-Nachrichten werden nicht geschrieben, die Methode wird einfach nicht aufgerufen, und nirgends werden Fehler ausgegeben.

Ich kann nicht denken, was hätte sich geändert, dass dies verursachen könnte, da es wie eine Low-Level-Framework-Sache scheint. Der Rest der App wird geladen und läuft gut, das Hauptfenster wird angezeigt (es ist eine WPF-App) und die Ereignisse werden ausgelöst. Es ist nur die Hintergrundthread-Methode, die nicht ausgelöst wird. Was könnte hier vor sich gehen?

+0

Schwer zu beantworten, ohne den gesamten tatsächlichen Code zu sehen. –

+0

BTW, verwenden Sie ein Quellcode-Versionskontrollsystem? –

+0

@MitchWheat: Es wäre schwer zu beantworten, es auch zu sehen, weil es ein großes Projekt ist. Ich bin nicht sicher, was ich schnipsen könnte, um das Problem zu isolieren, und die ganze Sache wäre viel zu viel, um die Leute zu fragen. Re: Quellcode, ja, ich denke, ich könnte zum letzten funktionierenden Code zurückkehren, obwohl ich ihn überhaupt nicht angefasst habe, also vermute ich, dass das Problem irgendwie umweltbedingt ist. –

Antwort

0

Nun, ich habe herausgefunden, wie ich das Problem beheben kann, obwohl ich mir nicht wirklich sicher bin, was hier wirklich vor sich geht. Wenn ich die OnDoWork Routine leer gelassen:

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

es würde heißen, und wenn ich da drin Grundgerüst Sachen setzt, wäre es auch genannt werden. Aber sobald ich eine Zeile wie folgt eingefügt habe:

Dim result = AnotherLibrary.SomeMethod() 

die Routine würde nicht aufgerufen werden. Ich schaute auf das Projekt für AnotherLibrary, das von mir auch geschrieben wird, schaute auf das Compile Tab, das Target CPU Dropdown und sah, dass es x86 sagte. Ich änderte es in Any CPU und das behob das Problem. Aber ich möchte immer noch wissen, was das wirklich bedeutet und warum es dieses Problem verursacht hat.

2

Häufiger Fehler bei der Verwendung von BackgroundWorker. Sie vergessen zweifellos, nach Ausnahmen zu suchen. Sie werden ganz ohne Diagnose verschluckt, wenn Sie den Code nicht explizit schreiben. Fix:

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

Es gibt keine Ausnahmen, da der Code überhaupt nicht ausgeführt wird. Ich setze Haltepunkte, Debugging-Anweisungen usw. ein. Der Code wird einfach nicht aufgerufen. Aber es scheint ein Problem mit dem CPU-Ziel zu sein (siehe meine Antwort). Hast du eine Ahnung, was dort vor sich geht? –

+0

Das falsche CPU-Ziel ist eine gute Möglichkeit, eine Ausnahme zu generieren. Suchen Sie im Ausgabefenster nach einer Benachrichtigung für die "erste Chance" vom Debugger. –

0

Ich habe eine Antwort, in Bezug auf ein ähnliches Problem. Wenn ich versuche, meinem Projekt einige DLLs hinzuzufügen (C# -wpf stuff), Wrapper von C++ - Code mit verwalteten Objekten, merke ich das gleiche Problem, wenn der zweite benutzt wurde.

In meinem Fall war es, weil die zwei Bibliothek verschiedene Instanzen verwendet, wenn die gleiche Bibliothek (Ver. XX.4.1 und XX.3.2). Kompilieren der Bibliothek auf dem gleichen, alles hat funktioniert.