动作(()=> {})通过调度程序冻结ui

时间:2014-09-28 14:02:30

标签: c# async-await

我尝试使用和不使用.ConfigureAwait(false)的简单async-await示例 使用.ConfigureAwait(false),您可以通过调度程序更新ui,如果没有它,则不需要 这是下面代码中的案例1和3 - 这是有效的,我可以理解它是如何工作的。

我的问题是关于案例2,我添加了一个 - 完全不必要的 - 刷新
Action(() => { })通过调度员 这偶尔会冻结我的ui。特别是在重复调用事件处理程序之后 任何人都可以解释为什么ui在案例2中冻结了吗?

private void Test_Click(object sender, RoutedEventArgs e)
{
    Test();
}

public async void Test()
{
    Print("Start task");

    // Case 1 & 2
    await Task.Delay(2000);
    // Case 3
    await Task.Delay(2000).ConfigureAwait(false);

    Print("Finished task");
}

void Print(string text)
{
    // Case 1 & 2
    Output.Inlines.Add(new Run(text) { Foreground = Brushes.Blue, FontWeight = FontWeights.Bold });
    // Case 2 only
    Output.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Background, new Action(() => { }));

    // Case 3
    Output.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Background, 
       new Action(() => 
       {  
         Output.Inlines.Add(new Run(text) { Foreground = Brushes.Blue, FontWeight = FontWeights.Bold 
       }); }));
}

1 个答案:

答案 0 :(得分:3)

这是WPF中的一个错误。

它运行一个已过滤的GetMessage()循环(请参阅here),will hang如果是一个卡在队列中但不符合过滤器的消息。