2012-05-24 7 views
0

У меня есть ViewModel, который содержит метод 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); 
    }); 
} 

Этот метод вызывается, каждые 10 секунд из timer_Tick обработчика событий. Затем данные запрашиваются async, а затем выполняется обратный вызов. Там запрошенные данные должны быть вставлены в Observable Collection (а не в STA Thread -> begin Invoke). Он правильно вводит обратный вызов, но код внутри Dispatcher.CurrentDispatcher.BeginInvoke не выполняется.

Что я делаю неправильно?

+0

вещи, которые я хотел бы проверить первое: это 'ошибки == null'? Есть ли элементы в '.Piecesproduced'? Добавление некоторых протоколов поможет диагностировать, что происходит. –

+0

ошибка нет. Выполняется строка Begin Invoke. PiecesProduced содержит элементы. – TheJoeIaut

+0

Что еще происходит в вашем стоп-лотке в этот момент? Ваш код не будет выполнен до тех пор, пока Диспетчер не завершит свое текущее задание - и до этого Диспетчеру необходимо предоставить шанс выполнить. Есть ли что-то еще, что блокирует Диспетчер? Является ли ваш 'timer' фактически' DispatcherTimer', или есть что-то еще долгое время в пользовательском интерфейсе? –

ответ

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); 
    }); 
} 
Смежные вопросы