【发布时间】:2013-12-02 11:02:20
【问题描述】:
我正在编写一个 .NET 库。其中一个类具有图书馆用户需要订阅的事件。询问这些事件的处理程序实现是否可以快速返回?还是这是一个有共同解决方案的常见问题?
(如果处理程序花费了很长时间,这不会是致命的 - 但如果他们的处理程序花费的时间超过大约半秒,事情就会开始出错 - 它是一个网络库,连接的对等点会认为这个对等点在事件引发时已经掉线在同一线程上发送回复)
例如
public delegate void Ping();
class A
{
/// <summary>
/// If your handler doesn't return quickly... I am going to cry.
/// </summary>
public event Ping Ping;
private void RaisePing()
{
var handler = Ping;
if(handler != null)
handler();
}
// this is called several times a secound
private void MainLoop()
{
if(something)
RaisePing();
// time important stuff - musn't take long to get here...
}
}
【问题讨论】:
-
我想真正的问题是,您还有哪些其他选择?
-
我想可以 BeginInvoke() 它在另一个线程(可能是线程池)上,或者我可以隐藏事件并让客户端定期轮询已经发生的事件..
-
看起来线程池可以在这里工作。虽然我不明白这个网络库是如何工作的。如果那是一些公共 API,那么为什么不使用 wcf 并让它管理远程调用呢?
-
@Artjom 是的 - 但也许它现在要求更多用户编写线程安全代码!我不使用 WCF 的原因有很多,我不在乎详细说明!
-
我想起了 Windows 的情况,它从 Cooperative multitasking 切换到 Pre-emptive multitasking 因为,嗯,开发人员不擅长与他人相处......
标签: c# .net events design-patterns event-handling