【发布时间】:2013-07-04 08:39:59
【问题描述】:
在下面的示例中,当同步调用异步“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 "";
}
【问题讨论】:
-
简而言之:
task.Result的意思是“挂起 UI 直到任务完成,然后使用结果”。await task的意思是“将控制权交给我的调用者;当任务完成时,安排任务的延续在未来方便的时间运行,然后使用结果”。
标签: c# .net asynchronous async-await