在我的代碼中,我訂閱了發生在另一個線程上的事件。每到這個事件發生時,我收到投遞到觀察集合的字符串:ObservableCollection上的BeginInvoke不立即
Dispatcher currentDispatcher = Dispatcher.CurrentDispatcher;
var SerialLog = new ObservableCollection<string>();
private void hitStation_RawCommandSent(object sender, StringEventArgs e)
{
string command = e.Value.Replace("\r\n", "");
Action dispatchAction =() => SerialLog.Add(command);
currentDispatcher.BeginInvoke(dispatchAction, DispatcherPriority.Render);
}
下面的代碼是在我的視圖模型(可以在後面的代碼,它不會在這種情況下重要) 。當我打電話給「hitstation.PrepareHit」時,上面的事件被調用了幾次,然後我等待並調用「hitStation.HitBall」,並且上面的事件被調用了幾次。
private void HitBall()
{
try
{
try
{
Mouse.OverrideCursor = Cursors.Wait;
//prepare hit
hitStation.PrepareHit(hitSpeed);
Thread.Wait(1000);
PlayWarning();
//hit
hitStation.HitBall(hitSpeed);
}
catch (TimeoutException ex)
{
MessageBox.Show("Timeout hitting ball: " + ex.Message);
}
}
finally
{
Mouse.OverrideCursor = null;
}
}
我遇到的問題是,只有當HitBall方法完成綁定到我的SerialLog ListBox中得到更新。我期待着看到來自PrepareHit的一堆更新,一個暫停,然後來自HitBall的更多更新。
我已經嘗試了幾個DispatcherPriority參數,但它們似乎沒有任何效果。
好的,工作!但現在我感到困惑。我嘗試了同樣的事情,但不是使用Action和begininvoke,而是創建並運行了一個任務,但結果並不相同......爲什麼? – 2010-05-20 05:42:26
對不起,你是如何創建任務的? 請記住,只使用一個任務,您不會與UI線程同步,但通過調度程序上的Invoke和BeginInvoke,您將明確地與UI同步。使用BeginInvoke可以以異步方式執行。 – 2010-06-01 06:01:48