2012-05-24 157 views
0

我有包含QueryData方法的視圖模型:Dispatch.BeginInvoke我究竟做錯了什麼?

void QueryData() { 
    _dataService.GetData((item, error) => 
    { 
     if(error != null) 
      return; 
     Dispatcher.CurrentDispatcher.BeginInvoke(new Action(() => 
     { 
      foreach(TimeData d in ((LineDetailData)item).Piecesproduced) { 
       Produced.Add(d); 
      } 
     }), DispatcherPriority.Send); 
    }); 
} 

調用此方法從timer_Tick事件處理程序的每個10秒。然後數據被異步查詢,然後執行回調。那裏查詢的數據,應該插入Observable集合(不是STA線程 - >開始Invoke)。它正確地進入回調,但不執行內部Dispatcher.CurrentDispatcher.BeginInvoke的代碼。

我在做什麼錯了?

+0

事我會先檢查:是'錯誤== null'? '.Pieces生產的'有物品嗎?添加一些日誌記錄將有助於診斷正在發生的事情。 –

+0

錯誤不爲空。開始調用行被執行。 PiecesProduced包含項目。 – TheJoeIaut

+0

還有什麼是你調用堆棧在這一點上發生了什麼?您的代碼不會被執行,直到調度完成其目前的工作 - 而在這之前,分派需要給予機會執行。是否還有其他事情阻止了Dispatcher?是您'timer'實際上是一個'DispatcherTimer',還是有別的東西在那個點上的UI長時間運行? –

回答

1

這不起作用,因爲您呼叫Dispatcher.CurrentDispatcher是在不同的線程運行的方法中。這不是您要找的Dispatcher

相反,你應該設置一個局部變量的當前Dispatcher調用你的方法之前,然後它會被提升到您的拉姆達爲您提供:

void QueryData() 
{ 
    var dispatcher = Dispatcher.CurrentDispatcher; 
    _dataService.GetData((item, error) => 
    { 
     if(error != null) 
      return; 
     dispatcher.BeginInvoke(new Action(() => 
     { 
      foreach(TimeData d in ((LineDetailData)item).Piecesproduced) { 
       Produced.Add(d); 
      } 
     }), DispatcherPriority.Send); 
    }); 
}