我有一个大问题。当我在Windows窗体中实现一个SqlDependency观察器时,只要我将“OnChance”事件调用到ui线程,一切正常。
private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
{
if (this.InvokeRequired)
{
OnChangeEventHandler tempDelegate = new OnChangeEventHandler(dependency_OnChange); object[] args = { sender, e };
this.Invoke(tempDelegate, args);
return;
}
SqlDependency dependency = (SqlDependency)sender;
dependency.OnChange -= dependency_OnChange;
SetSqlWatcher();
}
如果我将方法移动到类,我无法执行Invoke和InvokeRequired,因为我的类没有实现ISynchronizeInvoke。如果我对这些行进行注释,程序会在“SetSqlWatcher”的第一行挂起:
SqlDependency.Stop("Data Source=[....]");
当我在windowsform中注释这些行时会发生同样的情况,所以我认为_OnChance事件与我第一次调用SetSqlWatcher时使用的“线程”不同。
我还试图实现ISynchronizeInvoke(在libary http://nitoasync.codeplex.com中借助GenericSynchronizingObject)。我调试,看到代码必须在第一次调用它,但它也挂起在“SqlDependency.Stop”......
有人能够帮助我,也许可以解释一下为什么这不起作用?
非常感谢! 最好的祝福 托马斯
答案 0 :(得分:2)
是的,我自己发现了:)如果有人遇到同样的问题:我使用自己的线程解决了它,当它必须重新启动SqlDependency时,使用AutoResetEvent“通知”:
private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
{
SqlDependency dependency = (SqlDependency)sender;
dependency.OnChange -= dependency_OnChange;
autoEvent.Set();
}
public void ThreadWorker(object data)
{
while (true)
{
SetSqlWatcher();
autoEvent.WaitOne();
}
}