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

Wpf C#混合使用Task和Dispatcher.Invoke,为什么它会停止?,wpf,task,dispatcher,Wpf,Task,Dispatcher,我尝试了以下代码片段: public Task RunUiTask(Action action) { var task = Task.Factory.StartNew(() => { Dispatcher.Invoke(DispatcherPriority.Background, action); }); return task; } private void OnCr

我尝试了以下代码片段:

    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;
    }
公共任务运行任务(操作)
{
var task=task.Factory.StartNew(()=>
{
Dispatcher.Invoke(DispatcherPriority.Background,action);
});
返回任务;
}
私有void OnCreateTask(对象发送方,RoutedEventArgs e)
{
var task=RunUiTask(()=>
{
对于(inti=0;i

Dispatcher.Invoke(DispatcherPriority.Background, action);
将在UI线程中执行
操作
,并在执行
操作
后返回。 问题是,由于
OnCreateTask
中的
task.Wait()
导致UI Thead被阻塞,因此该操作将永远不会执行,并且会出现死锁

编辑

您应该使用延续并更新
ResultTextBlock.Text

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

那么如何解决这个问题呢?我不想使用BeginInvoke在另一个线程中运行OnCreateTask方法内容,然后确保在更新文本块时再次切换到UI线程。