2009-06-11 11 views
1

Ich komme zu Ihnen, um zu sehen, ob jemand eine Idee hat, wie man ein Problem löst, das ich während einer Migration zu ActiveMQ begegnet bin. Ich benutze ActiveMQ, um Benachrichtigungen innerhalb dieses Projekts (in C#) zu senden, und nachdem ich die Implementierung beendet habe, habe ich einige Fehler bezüglich Threading-Problemen gefunden. ( Ich weiß, dass die Lösung für diese Ausnahme zu verwenden, ist das „wenn this.InvokeRequired .... etc“, aber meine Frage ist:Methoden finden, die InvokeRequired benötigen

Gibt es eine Möglichkeit, alle Methoden zu finden, die diese aufrufen erfordern

natürlich i Schritt für Schritt überprüfen könnte alle Ereignisse mit den Meldungen ausgelöst, aber abgesehen von der Tatsache, dass es mir zu viel Zeit nehmen würde, wäre es nicht mir Fehler zukünftige Programmierung lösen.

ich denke, Es gibt einen besseren Weg, um das herauszufinden, aber ich kann nicht sofort daran denken. Haben Sie das Problem schon einmal gesehen?

Vielen Dank für Ihre Hilfe

Antwort

3

Nein. Es gibt keine automatische Möglichkeit, dies zu tun, es sei denn, Sie haben ein testgesteuertes Projekt von Anfang an eingerichtet. In diesem Fall könnten Sie einige Bedingungen hinzufügen, um die Thread-Korrektheit zu testen.

Software kann nicht ableiten, was Sie beabsichtigten, außer auf sehr spezifische Weise (zum Beispiel FxCop und die Warnungen der IDE zu bestimmten Dingen). Was du geschrieben hast, ist nicht unbedingt das, was du schreiben wolltest. Sie fragen effektiv nach Software, die herausfinden kann, was Sie vorhaben.

Die einzige Möglichkeit zu wissen, ob ein Aufruf erforderlich ist, ist, den Kontext zu kennen, in dem eine gegebene Funktion arbeitet. Wenn es in einem Hintergrundthread ausgeführt wird und Sie Code aufrufen, der im Hauptthread ausgeführt werden muss (z. B. GUI-Code), ist ein Aufruf erforderlich.

Sie müssen das selbst herausfinden.

+0

Ok, ich hatte Angst, es gab keine automatisierten Möglichkeiten, es zu tun. Ich denke, ich muss nur durch den Code dann gehen :) Vielen Dank für Ihre Hilfe! Zumindest werde ich nicht nach etwas suchen, das nicht existiert! – srodriguez

+0

Da Sie neu hier sind, sollten Sie in Erwägung ziehen, auf das Häkchen neben der Antwort zu klicken, von der Sie denken, dass sie Ihnen am meisten hilft. Ich sage nicht, dass ich es sein sollte ... nicht, außer du denkst es. ;) –

1

Es ist nicht so, dass bestimmte Methoden, die Sie aufrufen, die Invoke erfordern. Es hängt davon ab, von welchem ​​Thread diese Methoden aufgerufen werden.

Wenn Sie eine Methode in einer Winforms-App aufrufen, in einem anderen Thread als dem UI-Thread, wird das Invoke-Objekt benötigt.

Je nach Code sollte es einfach sein zu analysieren, welche Aufrufe von welchen Threads gemacht werden, besonders wenn Sie Hintergrundthreads benennen (was immer nützlich ist). Aber es gibt wahrscheinlich keinen automatischen Weg, dies zu tun - gehen Sie einfach zurück und schauen Sie sich Ihren Code an.

Verwandte Themen