在线程C#之间实现通信

时间:2014-01-24 14:00:59

标签: c# multithreading thread-safety

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

非常欢迎任何帮助。

5 个答案:

答案 0 :(得分:2)

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

将其放入新的控制台应用程序项目中以查看其运行情况。代码很粗糙,但它应该给你一个想法。

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();
    }
}

答案 1 :(得分:1)

您可以使用producer/consumer pattern生成器线程将数据放入队列,并且当队列中存在某些内容并且唤醒以获取队列中的项目时,将向消费者发出警报。

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

答案 2 :(得分:0)

您可以在发布/订阅模式http://msdn.microsoft.com/en-us/library/ff649664.aspx

上使用MSDN文章

答案 3 :(得分:0)

如果符合以下条件,最快的响应即可实现:

  • 所有消费者只有一个事件(因此制作人必须只设置1个事件,而不是100个);
  • 消费者已经在等待它;

伪实现:

ManualResetEvent event = new ManualResetEvent(false);

// consumer 1
event.WaitOne();
// consumer 2
event.WaitOne();

// producer
event.Set();
event = new ManualResetEvent(false);

答案 4 :(得分:-1)

您可以考虑利用为pub / sub提供API的消息队列。有些人喜欢RabbitMQ(http://www.rabbitmq.com/)和ActiveMQ(http://activemq.apache.org/

相关问题