2010-05-26 38 views
5

我正在研究一个涉及重用以及将一些现有MFC代码迁移到C#的项目。C#线程 - 在线程之间发布消息

MFC中的当前代码创建了一些线程,并使用:: PostthreadeMessage()和ON_THREAD_MESSAGE(msg,func)通过消息进行线程间异步通信。

:: PostthreadeMessage() - >将消息发送到特定的线程ID。 ON_THREAD_MESSAGE(msg,func) - >在收到消息(消息)时调用函数(func)。因为我不太了解C#中的线程接口,所以我试图在C#中搜索类似的API,但是找不到任何。

这将是巨大的,如果有人能帮助我找到在C#

+0

依靠接收线程有味精泵(并因此窗口)不呢? – 2010-05-26 04:38:51

回答

1

这里用于此目的的适当的功能是从C# MVP Nicholas Paldino建议:

如果您正在发布到线程, 而不是特定的窗口,那么你将不得不拥有一些 实现IMessageFilter 接口,然后通过 执行到静态 AddMessageFilter方法的 应用程序类,因此它可以处理 线程中出现的消息。

从另一个线程,您将有 通过P/Invoke层使用PostThreadMessage API 方法。

+1

这种方法存在风险。 PostThreadMessage使用threadId发布消息,但threadId和托管线程之间的关系不固定。来自MSDN“操作系统ThreadId与托管线程没有固定关系,因为非托管主机可以控制托管线程和非托管线程之间的关系。” http://msdn.microsoft.com/en-us/library/74169f59.aspx – 2010-05-26 04:54:01

+0

感谢Chris和Mitch !!! 只需要对您的建议进行更多的说明。 您提到过PostThreadMessage API。是来自user32 dll的,我可以导入并使用它吗? 如果是这样,那么我应该在哪里实现IMessageFilter接口,为什么? 没有实现它,我不能导入来自user32 dll的getmessage和postthreadmessage并使用它? 谢谢! – Harsha 2010-05-26 05:57:56

1

我会建议你不要为应用程序的这个(线程间通信)部分做直接端口。也许你可以检查你是否可以使用代表和事件。代表可以在启动时注册,并且可以调用这些代表(回调)而不是用户消息。

1

如果你的两个线程都在C#中,并且你在.NET 4上,我只需要使用一个ConcurrentQueue<T>并排队来自一个线程的消息,然后在另一个线程上消耗它们。

+0

感谢您的信息!我在.NET3.5上。我的线程将在C#中创建,并需要相互沟通。也是每个线程将使用一些MFC DLL,并从该MFC代码,我想通过线程ID在C#中的其他线程进行通信。 希望它给你一些想法! – Harsha 2010-05-27 03:00:27