6

我尝试了以下片段:

    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) 从未被调用吗?谢谢。

4

1 回答 1

8

的呼唤

Dispatcher.Invoke(DispatcherPriority.Background, action);

Action在您的 UI 线程中执行,并在Action执行后返回。问题是,您的 UI Thead 由于task.Wait()OnCreateTask的 .

编辑

而不是你的,task.Wait()你应该使用延续和更新ResultTextBlock.Text

task.ContinueWith(t=>{
     ResultTextBlock.Text += "Finished";
}, TaskScheduler.FromCurrentSynchronizationContext());
于 2013-03-19T13:14:07.407 回答