我尝试使用和不使用.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
}); }));
}