【问题标题】:Sending messages between threads in C#在 C# 中的线程之间发送消息
【发布时间】:2010-11-21 10:31:18
【问题描述】:

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

【问题讨论】:

  • 嗨,看看这个教程可能会有所帮助:) dreamincode.net/forums/topic/…
  • 你想在线程之间协调工作还是共享数据?
  • 你到底想做什么?跨线程“发送消息”是一个在大多数情况下并不是真正有用的概念。

标签: c# multithreading thread-safety


【解决方案1】:

一种解决方案是共享一个并发队列,例如(尽管它的名称)ConcurrentQueue。这将允许您将一个对象从一个线程入队,并使另一个线程(或其他线程)从队列中出队。因为它是一个通用的解决方案,你可以传递强类型的项目,从 stringAction 的任何东西都可以,当然也可以是你自己的自定义消息类。

这种方法只有一个限制,ConcurrentQueue 类只能从 .NET 4.0 开始使用。如果您需要在以前版本的 .NET 中使用此功能,则需要寻找第三方库。例如,您可以使用source for ConcurrentQueue from mono

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


完整披露(根据faq):我是其中一个第三方库的作者...my libraries(nuget 可用),它包括一个用于旧版本.NET 的后向端口ConcurrentQueue,基于自定义实现。你可以在Theraot.Collections.ThreadSafe.SafeQueue下找到底层结构,它是一个数组的链表(保存在对象池中),这样我们就不需要复制数组来增长(因为我们只是添加另一个节点到列表),并且我们不需要经常依赖同步机制(因为添加或删除项目不会经常修改列表)。

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

【讨论】:

    【解决方案2】:

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

    生产者/消费者方法可以作为此类问题的可能解决方案。从 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/

    【讨论】:

      【解决方案3】:

      我想你说的是Joining between threads?this.

      【讨论】:

      • 那只是一个线程等待另一个线程的终止。还有 许多 其他线程间通信模式,如果 C# 不支持其他消息传递模式,我会感到非常震惊(即使我不知道足以回答问题)。
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        您可以在 .Net 中使用许多线程同步原语,例如 EventWaitHandle、Mutex、Semaphores 等。这是 MSDN 上的一个有用链接,可以了解如何使用。 - https://docs.microsoft.com/en-us/dotnet/standard/threading/overview-of-synchronization-primitives

        【讨论】:

          猜你喜欢
          • 2011-02-24
          • 2014-06-11
          • 1970-01-01
          • 1970-01-01
          • 2017-06-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多