我正在开发一个程序,它可以响应来自互联网套接字的事件,也可能来自定时器。使用两个线程似乎很自然:
其他要求:
现在提出一些问题: - ):
Invoke()
。这是对的吗?最后但并非最不重要:我想我的目标是消息生产者/消费者范例的并行,但我想使用事件而不是消息。你认为有更好的方法吗?
谢谢,
波阿斯
修改
我想先解释一下我使用事件的动机。该应用程序是一个自动交易引擎,必须响应市场中发生的事件(例如股票价格的变化)。发生这种情况时,主线程上可能有多个订阅者应该被调用,这是使用事件的经典场景。
我想我总是可以将Producer / Consumer与一些消息队列一起使用,并让消费者在主线程上引发事件,但我认为可能有更直接的方式。
答案 0 :(得分:4)
我认为使用消息将是最简单的方法。如果您使用的是C#4,这要归功于BlockingCollection<>
所以有一个共享的BlockingCollection,其中Message是你的消息类。
然后在你的工作线程中执行此操作
var msgEnum = blockingCollection.GetConsumingEnumerable();
//Per thread
foreach( Message message in msgEnum )
{
//Process messages here
}
就是这样。
GetConsumingEnumerable()将阻塞,直到有消息要处理。然后它将从队列中删除该消息,您的循环将处理它。
这有什么好处,你可以添加更多的线程,每个线程都有你的foreach循环。
完成后,请调用blockingCollection.CompletedAdding();
BTW队列处理并发并将同时发送的消息排队等。
希望这有帮助
安德烈
答案 1 :(得分:2)
您可以在线程之间实现共享队列。每当引发事件时,您都可以将其推入队列中。主线程是一个无限循环,它检查新事件,将它们从队列中删除,处理事件以及何时没有更多事件它会休眠一段时间。