1

当先前事件处理程序的调用未完成时,SqlDependency(例如)是否会触发 OnChange 事件?(假设 OnDependencyChange 方法非常耗时)到底发生了什么?

SqlDependency dependency=new SqlDependency(command);


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

2 回答 2

2

我对这门课不太熟悉SqlDependency,但根据 MSDN 文档:

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

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

于 2010-08-31T18:24:23.527 回答
0

在普通的单线程程序中不会。尝试以下操作:

添加 Windows 窗体应用程序。将按钮添加到表单。使用以下方法处理按钮的点击事件:

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

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

于 2010-08-31T17:57:56.143 回答