C#混合使用Task和Dispatcher.Invoke,为什么会停止?

时间:2013-03-19 13:07:29

标签: wpf task dispatcher

我在下面尝试了片段:

    public Task RunUiTask(Action action)
    {
        var task = Task.Factory.StartNew(() =>
        {
            Dispatcher.Invoke(DispatcherPriority.Background, action);
        });
        return task;
    }

    private void OnCreateTask(object sender, RoutedEventArgs e)
    {
        var task = RunUiTask(() =>
            {
                for(int i=0;i<10;i++)
                {
                    ResultTextBlock.Text += i.ToString();
                }
            });
        task.Wait();                        //(a) Program stopped here
        ResultTextBlock.Text += "Finished"; //(b) Never called;
    }

我无法理解为什么当调用OnCreateTask(按钮单击事件处理程序)时,程序在(a)处停止,而(b)从不被调用。

注意:我知道我可以使用Dispatcher.BeginInvoke来使程序响应,但这不是我关注的问题。

任何人都可以告诉为什么程序在(a)处停止,为什么(b)从未被调用?感谢。

1 个答案:

答案 0 :(得分:7)

的召唤
Dispatcher.Invoke(DispatcherPriority.Background, action);

将在您的UI线程中执行Action,并在执行Action后返回。 问题是,由于task.Wait()中的OnCreateTask,您的UI Thead被阻止,因此Action将永远不会执行,并且您有死锁。

修改

您应使用续订和更新task.Wait()

,而不是ResultTextBlock.Text
task.ContinueWith(t=>{
     ResultTextBlock.Text += "Finished";
}, TaskScheduler.FromCurrentSynchronizationContext());