2011-03-15 8 views
2

큰 문제가 있습니다. Windows Forms에서 SqlDependency 와쳐를 구현할 때 UI 개체에 "OnChance"이벤트를 호출하는 한 모든 것이 올바르게 작동합니다. 내 수업이 ISynchronizeInvoke를 구현하지 않기 때문에 클래스에서 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(); 
} 

I 클래스 내 메소드를 이동하는 경우

, 나는, 호출 및 InvokeRequired을 할 수 아니에요. 나는이 라인을 주석 경우, 프로그램은 "SetSqlWatcher"의 첫 번째 줄에 중단 :

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

나는 windowsform에서이 라인을 주석 때 같은 일이 발생, 그래서 나는 _OnChance 이벤트가 다른 스레드가 아닌 상이라고 생각 처음에 SetSqlWatcher를 호출 할 때 사용하는 "스레드".

또한 (libary http://nitoasync.codeplex.com의 GenericSynchronizingObject를 사용하여) ISynchronizeInvoke를 구현하려고했습니다. 나는 처음에 코드를 호출해야한다는 것을 디버깅 해 보았지만 "SqlDependency.Stop"에도 걸려있다 ...

누군가가 나를 도울 수 있었고, 왜 이것이 작동하지 않는지 설명 할 수있다. ?

대단히 감사합니다! 안부 토마스

답변

2

그래, 나는 그것을 발견 자신 :) 사람이 같은 문제로 실행하는 경우 : I, 즉는 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(); 
    } 
} 
관련 문제