当你使用
你可以通过使用
这个怎么样?
await
关键字等待一个 Task
时,默认情况下延续操作会在同一线程上运行。唯一需要这样做的情况是当你处于 UI 线程时,同时延续操作也需要在 UI 线程上运行。你可以通过使用
ConfigureAwait
来控制这个过程,例如:await SomeMethodAsync().ConfigureAwait(false);
...这可以用来卸载UI线程上不需要运行的工作。 (但请参见下面Stephen Cleary的评论。)
现在考虑一下这段代码:
try
{
await ThrowingMethodAsync().ConfigureAwait(false);
}
catch (Exception e)
{
// Which thread am I on now?
}
这个怎么样?
try
{
await NonThrowingMethodAsync().ConfigureAwait(false);
// At this point we *may* be on a different thread
await ThrowingMethodAsync().ConfigureAwait(false);
}
catch (Exception e)
{
// Which thread am I on now?
}
catch
块中调用await
,而之前是不允许的。在 C# 5 中,在try
块中调用await
是完全没有问题的。 - Scott Chamberlainasync
介绍,解释了异步方法如何恢复。此外,“这对于卸载不需要在UI线程上运行的工作非常有用”是可疑的-只有在异步操作实际上异步完成时才是真的;如果它同步完成(例如,下载缓存的资源),它将不会离开UI线程。卸载工作的正确方法是Task.Run
。 - Stephen Cleary