当前一个处理程序没有完成时,事件被触发了吗?

时间:2010-08-31 17:52:04

标签: c# events sqldependency

当前一个事件处理程序的调用没有完成时,SqlDependency(例如)是否会触发OnChange事件? (假设OnDependencyChange方法非常耗时) 究竟发生了什么?

SqlDependency dependency=new SqlDependency(command);


// Subscribe to the SqlDependency event.
dependency.OnChange += new
OnChangeEventHandler(OnDependencyChange);

2 个答案:

答案 0 :(得分:2)

我不熟悉SqlDependency类,但是根据MSDN文档:

  

可能会生成OnChange事件   与线程不同的线程   启动了命令执行。

这似乎打开了两个事件处理程序可以同时运行的可能性。没有文档声明在提升事件之前调用的所有事件处理程序必须在再次引发事件之前完成。安全的做法是假设可以发生多个同时的事件调用。因为事件是在未定义的线程上引发的,所以无论如何都要防止并发问题。

答案 1 :(得分:0)

在正常的单线程程序中,它不会。请尝试以下方法:

添加Windows窗体应用。在表单中添加一个按钮。使用以下方法处理按钮的单击事件:

private void Buttonclick(object sender, EventArgs e)
{
    Thread.Sleep(25);//SUSPEND CURRENT THREAD
}

在调用Thread.Sleep(25)完成其工作(暂停线程25秒)之前,您将无法单击该按钮。您也可以在控制台应用中对此进行测试。