【问题标题】:Implementing comunication between threads C#实现线程之间的通信C#
【发布时间】:2014-01-24 22:42:35
【问题描述】:

我有 Class1,它有来自 API 的消息的事件侦听器。当收到信号时,我想将此消息发送到处理该消息的多个其他工作线程。在 C# 中实现这一点的最简单和最快的方法是什么?有没有关于这个主题的好教程?我主要关心的是如何尽可能快地将传入消息传递给工作线程,因为它们必须尽可能快地响应 API。

非常欢迎任何帮助。

【问题讨论】:

  • 你尝试过使用事件吗?
  • @MarioStoilov 事件只是委托,并在调用线程上执行 - (虽然委托有时也可以在池线程上执行) - 事件(本身)不提供线程间通信频道

标签: c# multithreading thread-safety


【解决方案1】:

如果问题像你说的那么简单,那么我会使用生产者/消费者模式

将它放到一个新的控制台应用项目中以查看它的实际效果。代码很粗糙,但它应该能给你一个想法。

class Program
{
    static BlockingCollection<string> _signalStore = new BlockingCollection<string>();

    static void Listener()
    {
        while(true)
        {
            var message = _signalStore.Take();
            Console.WriteLine(Thread.CurrentThread.ManagedThreadId + ": " + message);
        }
    }

    static void Sender()
    {
        var counter = 0;
        while(true)
        {
            _signalStore.Add(counter++.ToString());
            Thread.Sleep(100);
        }
    }

    static void Main(string[] args)
    {
        var listenerCount = 5;

        for (var i = 0;  i < listenerCount; i++)
        {
            var newListnerTask = new Task(Listener);
            newListnerTask.Start();
        }


        var newSenderTask = new Task(Sender);
        newSenderTask.Start();

        Console.ReadKey();
    }
}

【讨论】:

    【解决方案2】:

    您可以使用producer/consumer pattern,您的生产者线程将数据放入队列中,当队列中有内容时,消费者会收到警报并唤醒以获取队列中的项目。

    .NET 框架BlockingCollections 将帮助您实现此模式。

    【讨论】:

      【解决方案3】:

      您可以使用有关 Pub/Sub 模式的 MSDN 文章http://msdn.microsoft.com/en-us/library/ff649664.aspx

      【讨论】:

        【解决方案4】:

        如果满足以下条件,则最快响应:

        • 所有消费者只有一个事件(因此生产者只需设置 1 个事件,而不是 100 个);
        • 消费者已经在等待它了;

        伪实现:

        ManualResetEvent event = new ManualResetEvent(false);
        
        // consumer 1
        event.WaitOne();
        // consumer 2
        event.WaitOne();
        
        // producer
        event.Set();
        event = new ManualResetEvent(false);
        

        【讨论】:

          【解决方案5】:

          您可以考虑利用为发布/订阅提供 API 的消息传递队列。最喜欢的有 RabbitMQ (http://www.rabbitmq.com/) 和 ActiveMQ (http://activemq.apache.org/)

          【讨论】:

          • 这对于进程内通信来说太重了。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-05
          相关资源
          最近更新 更多