2011-03-15 43 views
2

我有一個很大的問題。當我在Windows窗體中實現一個SqlDependency監視器時,只要我調用我的「OnChance」事件到ui線程,一切正常。如何在類中使用SqlDependency?

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(); 
} 

如果我提出我的方法的一類,我不能做調用和InvokeRequired,因爲我的課沒有實現ISynchronizeInvoke。如果我評論這行,該程序在「SetSqlWatcher」掛在第一行:

SqlDependency.Stop("Data Source=[....]"); 

當我評論的windowsform這些線路同樣的情況,所以我覺得_OnChance事件是在不同的線程比我在第一次調用SetSqlWatcher時使用的「線程」。

我也嘗試實現ISynchronizeInvoke(藉助於庫裏的GenericSynchronizingObject http://nitoasync.codeplex.com)。我調試,看到代碼必須第一次調用它,但它也掛在「SqlDependency.Stop」...

是有人能夠幫助我,也許解釋我爲什麼這不能工作?

非常感謝! 最好的問候 托馬斯

回答

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(); 
    } 
}