2010-05-26 23 views
5

Ich arbeite an einem Projekt, das die Wiederverwendung sowie die Migration eines Teils des vorhandenen MFC-Codes zu C# beinhaltet.C# -Threads - Nachrichten zwischen Threads posten

Der aktuelle Code in MFC, erstellt einige Threads und verwendet :: PostthreadeMessage() und ON_THREAD_MESSAGE (msg, func) für Inter-Thread-asynchrone Kommunikation über Nachrichten.

:: PostthreadeMessage() -> sendet eine Nachricht an eine bestimmte Thread-ID. ON_THREAD_MESSAGE (msg, func) -> ruft die Funktion (func) auf, wenn eine Nachricht (msg) empfangen wird.

Da mir die Threading-Schnittstellen in C# nicht sehr bekannt sind, habe ich versucht, in C# nach ähnlichen APIs zu suchen, konnte aber keine finden.

Es wäre toll, wenn jemand mir helfen kann die entsprechenden Funktionen für diesen Zweck in C# bei der Suche ist

+0

, die auf den Empfangs-Thread mit einer msg-Pumpe (und damit ein Fenster) beruht es nicht? –

Antwort

1

Hier ist die Beratung von C# MVP Nicholas Paldino:

Wenn Sie auf den Thread Mitteilung verfassen, und nicht zu einem bestimmten Fenster, dann müssen Sie haben etwas, das implementiert die IMessageFilter Schnittstelle, und dann übergeben Sie diese Implementierung an die statische AddMessageFilter-Methode auf der Application-Klasse, so kann es die Nachricht behandeln, die auf dem Thread kommt.

Von dem anderen Thread haben Sie , um die Methode PostThreadMessage API über den P/Invoke-Layer zu verwenden.

+1

Es besteht ein Risiko für diesen Ansatz. PostThreadMessage sendet eine Nachricht mithilfe der threadId, aber die Beziehung zwischen threadId und einem verwalteten Thread ist nicht behoben. Von MSDN "Eine ThreadId des Betriebssystems hat keine feste Beziehung zu einem verwalteten Thread, da ein nicht verwalteter Host die Beziehung zwischen verwalteten und nicht verwalteten Threads steuern kann." http://msdn.microsoft.com/en-us/library/74169f59.aspx –

+0

Danke an Chris und Mitch !!! Benötigt nur ein paar mehr Erläuterungen zu Ihren Vorschlägen. Sie erwähnten die PostThreadMessage-API. Ist es die Benutzer-DLL, die ich dllimport und verwenden kann? Wenn ja, wo genau sollte ich IMessageFilter Schnittstelle implementieren und warum? Ohne es zu implementieren, kann ich die getmessage und postthreadmessage von user32 dll nicht importieren und verwenden? Danke! – Harsha

1

Ich würde Ihnen raten, einen direkten Port für diese (Inter-Thread-Kommunikation) Teil der Anwendung zu tun. Möglicherweise können Sie überprüfen, ob Sie Delegaten und Ereignisse verwenden können. Ein Delegat könnte beim Start registriert werden und diese Delegaten (Callbacks) könnten anstelle der Benutzernachricht aufgerufen werden.

1

Wenn beide Threads in C# sind und Sie auf .NET 4 sind, würde ich einfach eine ConcurrentQueue<T> verwenden und Nachrichten aus einem Thread in eine Warteschlange stellen und sie dann auf der anderen Seite konsumieren.

+0

Danke für die Info !! Ich bin auf .NET3.5. Meine Threads werden in C# erstellt und müssen miteinander kommunizieren.Auch jeder Thread wird einige MFC-DLL verwenden, und von diesem MFC-Code möchte ich mit dem anderen Thread in C# mithilfe Thread-ID kommunizieren. Hoffe es gibt Ihnen eine Idee !!! – Harsha