在下面的示例中,当同步调用异步“Process”函数时,我可以看到对“await Task.Delay(1000)”的调用导致 UI 挂起。
我知道我可以通过调用“await Task.Delay(1000).ConfigureAwait(false)”或将“Process”调用包装在另一个任务中来避免挂起。我可以理解问题在于同步上下文,并且我知道 await 正在做一些花哨的事情,即如果我将调用“await Task.Delay(1000)”替换为“Task.Delay(1000).Wait()”UI不挂。
有人可以解释一下这种行为吗(我确实尝试查看 ildasm 代码,但没有帮助)。非常感谢。
public MainWindow()
{
InitializeComponent();
Loaded += OnLoaded;
}
public async void OnLoaded(object sender, RoutedEventArgs args)
{
var task = Process();
MessageBox.Show(task.Result);
}
public async Task<String> Process()
{
await Task.Delay(1000);
return "";
}