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

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

最佳答案

的呼唤

Dispatcher.Invoke(DispatcherPriority.Background, action);

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

编辑

而不是您的 task.Wait()您应该使用继续和更新 ResultTextBlock.Text
task.ContinueWith(t=>{
     ResultTextBlock.Text += "Finished";
}, TaskScheduler.FromCurrentSynchronizationContext());

关于wpf - C#混合使用Task和Dispatcher.Invoke,为什么会停止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15500398/

相关文章:

.net - 从 UserControl 的子控件传递事件 - 最直接的方法?

c# - WPF 属性验证检查属性是否有效

wpf - TemplateBinding 如何在 UserControl 模板中工作?

Java 长时间运行的计时器正在被 GC 使用

.net - 在线程中创建 WPF 弹出窗口时出现 "The calling thread must be STA, because many UI components require this"错误

c# - 在 wpf 中找不到 MainWindow.xaml 文件

scala - 如果另一个任务失败,如何组合两个并行任务以取消一个任务?

ios - 建立网络连接后,我可以让 iOS 7 在后台发送图片吗?

wpf - UnhandledExceptionFilter 捕获所有异常但只重新抛出一些异常

c# - wpf 窗口 (ui) 被长时间渲染操作阻塞 - 可以使用后台线程进行渲染吗?