我有Class1,它有来自API的消息的事件监听器。收到信号后,我想将此消息发送给处理该消息的多个其他工作线程。在C#中实现这个的最简单,最快捷的方法是什么?有没有关于这个主题的好教程?我主要担心的是如何尽可能快地将传入消息传递给工作线程,因为他们必须尽可能快地响应API。
非常欢迎任何帮助。
答案 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)
如果符合以下条件,最快的响应即可实现:
伪实现:
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/)