2015-04-12 2 views
-1

Я пытаюсь создать метод, который будет инкапсулировать все операции графического интерфейса из другого потока, однако когда я его использую, ничего не происходит, и исключение не генерируется.
Это то, что я получил:Обновить графический интерфейс из задачи

private Task t1; 
    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     t1 = Task.Factory.StartNew(() => DoStuffInTask()) 
      .ContinueWith(tsk => Finished(tsk)); 
    } 

    private void DoStuffInTask() 
    { 
     //doing important stuff... 
     for (int i = 0; i < Int16.MaxValue; i++) 
     { 
      //Text is a property that raises INotifyPropertyChanged event 
      RunOnGui(() => { Text = i.ToString(); }); // not working, not throwing exception 
      Application.Current.Dispatcher.Invoke(() => Text = i.ToString()); // works fine 
     } 
    } 

    private void RunOnGui(Action action) 
    { 
     Application.Current.Dispatcher.Invoke(() => action); 
    } 

ответ

3

Эта линия

Application.Current.Dispatcher.Invoke(() => action); 

компилирует к перегрузке public TResult Invoke<TResult>(Func<TResult> callback);

Ваш код выполнения Func<Action> который просто возвращает действие, не выполняет его.

Что вам нужно это

private void RunOnGui(Action action) 
{ 
    Application.Current.Dispatcher.Invoke(action);//Note no lambda here 
} 
Смежные вопросы