2011-07-27 42 views
2

對,此時我正在爲GUI編程某些東西。然而,我面臨的同步問題似乎無法解決。同步調用(通過調度程序)或直接調用的調用

我開始/停止通過UDP遠程回放視頻。傳入的代碼/命令被解析,然後在'Window'類中執行。

由於它是一個GUI元素,任何去元素的調用都必須在它創建的線程上執行。雖然,我的UDP客戶端運行在自己的線程上。因此任何調用都需要通過Dispatcher.Invoke方法。

但是,這工作正常。這有很多問題。例如'load'方法和'play'方法可以彼此直接執行。這可能會導致'play'方法在'load'方法之前執行。因爲我無法控制何時在所述對象上調用動作。

所以我想,我會在對象上使用monitor/mutex/semaphore/lock(),然後再等待它再次釋放。請參閱下面的代碼片段。但是,這是造成異常:

SynchronizationLockException是通過調用退出,脈搏, PulseAll拋出,並從代碼不同步 塊等待Monitor類的方法。

所以我正在尋找一個更好/工作方式來同步兩個線程。如果調用通過調度程序調用,那麼另一個線程將基本上等待,直到調用的方法調用完畢。

另外,如果我使用錯誤的條款,請原諒我的措辭。

調度方法:

#region ExecuteDispatch Members 
public void Dispatch(Callback call) 
{ 
    Dispatch(this, call); 
} 
public void Dispatch(DispatcherObject o, Callback call) 
{ 
    if (!o.Dispatcher.CheckAccess()) 
    { 
     o.Dispatcher.Invoke(
      System.Windows.Threading.DispatcherPriority.Send, 
      new Action(call) 
     ); 
    } 
    else 
    { 
     call(); 
    } 
} 
#endregion 

方法應該是「同步」:

Monitor.Enter(player); 
Dispatch(delegate() 
{ 
    player.Stop(); 
    Monitor.Exit(player); 
}); 
Monitor.Enter(player); 
Monitor.Exit(player); 

回答

2

一種可能的方式是讓一個線程信號對方認爲他完成了他的工作。因此,您可以使用AutoResetEvent或ManualResetEvent:

AutoResetEvent evt = new AutoResetEvent(false); 

Dispatch(delegate() 
{ 
    player.Stop(); 
    evt.Set(); 
}); 

evt.WaitOne(); //Here the thread waits until Set is called on evt 
+0

這似乎是做我需要做的事情。我會等待更長時間才能彈出其他答案,否則這個答案將被接受 –