在C#中的线程之间发送消息

时间:2010-11-21 10:31:19

标签: c#

如何在线程之间发送和接收消息?

5 个答案:

答案 0 :(得分:4)

一个解决方案是共享一个并发队列,例如(虽然它的名字)ConcurrentQueue。这将允许您从一个线程入队对象,并让另一个线程(或其他线程)从队列中出队。由于它是一种通用解决方案,您可以传递强类型项,从stringAction将会执行任何操作,或者您自己的自定义消息类。

Threre只是这种方法的一个限制,类ConcurrentQueue只能从.NET 4.0开始提供。如果您需要以前版本的.NET,则需要查找第三方库。例如,您可以使用source for ConcurrentQueue from mono

这些队列工作的一般方法是使用链表,并使用旋转进行同步来为乐观并发控制提供资源。据我所知,这是可变大小的并发队列的现状。现在,如果你事先知道消息加载,你可以尝试一个固定大小的方法或一个有利于入队和出队的解决方案(这将是一个基于数组的队列)。


完整的透露者(根据faq):我是其中一个第三方图书馆的作者...... my libraries(可用的是nuget),它包含一个backport ConcurrentQueue for旧版本的.NET,基于自定义实现。您可以在Theraot.Collections.ThreadSafe.SafeQueue下找到底层结构,它是一个数组的链接列表(保存在一个对象池中),通过这种方式,我们不需要复制数组来增长(因为我们只是将另一个节点添加到列表中),我们不需要经常依赖同步机制(因为添加或删除项目不会经常修改列表)。

注意:此问题用于链接到另一个存储库上托管的HashBucket,这是我对该问题的旧解决方案。该项目已停止使用,请使用我上面提到的版本。

答案 1 :(得分:3)

这是一个古老的问题,但仍然是一个相关主题...

生产者/消费者方法可用作此类问题的可能解决方案。从3.0版开始的.NET Core拥有一个命名空间,该命名空间包含用于以简单方式处理该命名空间的工具。

看看System.Threading.Channels:

https://docs.microsoft.com/en-us/dotnet/api/system.threading.channels https://devblogs.microsoft.com/dotnet/an-introduction-to-system-threading-channels/

答案 2 :(得分:0)

我认为你在谈论Joining between threads?this.

答案 3 :(得分:0)

一种方法是创建一个具有您将为该线程调用的方法的类 那个班可以拥有的不仅仅是方法;它可以拥有父线程可以访问的成员 鉴于此,父母可以读取和写入这些成员,这样就可以在线程生命的整个范围内有两种线程之间的通信方式。

答案 4 :(得分:0)

您可以在.Net中使用许多线程同步原语,例如EventWaitHandle,Mutex,Semaphores等。这是MSDN上有用的链接,可以了解如何使用。 - http://msdn.microsoft.com/en-us/library/ms228964.aspx

相关问题