2015-04-12 75 views
-1

我试图创建一个方法来封装所有来自不同线程的GUI操作,但是当我使用它时,没有任何反应,也没有引发任何异常。
这是我的了:任务更新GUI

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 
}