C#: Wie zu zwingen, "calling", eine Methode aus dem main thread durch die Signalisierung, die in irgendeiner Weise aus einem anderen thread
Sorry für den langen Titel, ich weiß nicht, auch die Art und Weise, wie auf die ausdrückliche Frage
Ich bin mit einer Bibliothek, die ein Rückruf von einem anderen Kontext aus dem Haupt-thread (ist eine C-Bibliothek), habe ich den Rückruf in C# und Wann aufgerufen wird, möchte ich nur ein Ereignis auslösen.
Jedoch, weil ich nicht weiß, was innerhalb der Fall, ich möchte einen Weg finden, um die Methode aufzurufen, ohne das problem der Schleusen und so weiter (sonst wird die Dritten, die Benutzer haben, um diese zu bewältigen innen der Veranstaltung, sehr hässlich)
Gibt es eine Möglichkeit, dies zu tun?
Ich kann völlig auf dem falschen Weg, aber ich bin denken über winforms Weg, um die Handhabung der verschiedenen threads (der .Aufrufen der Sache)
Ansonsten kann ich senden Sie eine Nachricht an die message-loop von dem Fenster, aber ich weiß nicht viel über message-passing und wenn ich es senden kann "custom" - Nachrichten wie diese
Beispiel:
private uint lgLcdOnConfigureCB(int connection, System.IntPtr pContext)
{
OnConfigure(EventArgs.Empty);
return 0U;
}
dieser callback wird aufgerufen, aus einem anderen Programm, die ich nicht kontrollieren, ich möchte zu laufen OnConfigure Methode in der main-thread (der, der behandelt meine winform), wie es zu tun?
Oder in anderen Worten, ich würde gerne OnConfigure ohne die Notwendigkeit des Denkens zu sperren
Edit 1:
Ich habe ein problem mit dieser Ausnahme:
CallbackOnCollectedDelegate retrived
Meldung: Rückruf laufen delegieren 'G19dotNet!G19dotNet.LgLcd+lgLcdOnSoftButtonsCB::Invoke' gesammelt GarbageCollector. Bei nicht verwalteten code Delegierten sichergestellt werden sollte, wird nie gelöscht werden, bis Sie sich sicher sind, Sie werden nie genannt
Edit 2:
Problem gelöst, indem ich mich, Dank Stackoverflow, die hilft mir immer!
Für zukünftige Referenz: Die Definition eines delegate als Funktionszeiger
Prüfen Sie die Frage, ich habe ein code-Beispiel
InformationsquelleAutor Fire-Dragon-DoL | 2011-01-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie mit WinForms und den Sie ausführen möchten, die etwas auf dem UI-thread, müssen Sie rufen Sie entweder
Invoke
oderBeginInvoke
auf eine gewisse Kontrolle (sei es einButton
oder eineForm
oder was auch immer) erstellt wurde auf diesem thread. Benötigen Sie einen Verweis, um es in Ordnung, dies zu tun.Beispielsweise mit Ihrem code und der Annahme, dass Sie einen Verweis auf ein Formular namens
form
:InformationsquelleAutor Adam Robinson
Rufen Sie vor der 3rd-party-Funktion, einen Verweis auf Dispatcher.CurrentDispatcher. In der callback-Funktion, verwenden dispatcher.Invoke.
Was Sie am Ende wird in etwa so Aussehen:
Dispatcher ist nur für WPF; er scheint mit WinForms.
Robinson: Dispatcher ist nicht nur für WPF - es funktioniert auch in der Konsole-Anwendung oder WinForms. Fügen Sie einfach einen Verweis auf System.Windows.Threading.
Dispatcher wurde nicht speziell für die Arbeit mit WinForms, obwohl Sie es kann. Jedoch, Sie können nicht in der Art und Weise vor.
Dispatcher.CurrentDispatcher
erst wieder die richtige Instanz, wennDispatcher.CurrentDispatcher
innerhalb von code, der ausgeführt wird auf dem UI-thread. Es ist viel einfacher zu verwenden ist der richtige thread-Synchronisation MechanismusControl.Invoke
undControl.BeginInvoke
.Du hast Recht, aber ich antwortete auf die Frage, vor der OP bearbeitet und WinForms. @Fire-Dragon-DoL: Verwenden Sie Adams Vorschlag, es ist besser geeignet für WinForms. Ich lösche diese Antwort.
InformationsquelleAutor Greg Sansom
Gibt es ein Muster für diese genannt Event-based Asynchronous Pattern. Der verlinkten Artikel ist eine schöne übersicht, wie man es benutzt. Die AsyncOperation - Klasse ist der Schlüssel zu diesem Muster.
Dieses Muster passen vielleicht nicht perfekt mit Ihrem problem, das Sie versuchen zu lösen, aber es könnte Ihnen einige Einblicke in das problem.
InformationsquelleAutor Brian