對,此時我正在爲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);
這似乎是做我需要做的事情。我會等待更長時間才能彈出其他答案,否則這個答案將被接受 –