从任务更新GUI

时间:2015-04-12 11:13:03

标签: c# wpf task-parallel-library .net-4.5

我试图创建一个方法来封装来自不同线程的所有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);
    }

1 个答案:

答案 0 :(得分: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
}