根据我的理解,如果等待异步函数,则以下代码将包装在委托中并在异步函数返回后执行:
async bool Test()
{
await byte[] arr = ReadAsync(....)
// all following code will be wrapped into a delegate
if (arr != null)
{
// Do something
return true;
}
return false;
}
如果我在ContinueWith中明确地包含以下代码,那听起来就好了。
async bool Test()
{
bool res = await ReadAsync(...)
.ContinueWith(t =>
{
byte[] arr = t.Result;
if (arr != null)
{
// Do something
return true;
}
return false;
});
}
这两种实现之间是否存在差异?
答案 0 :(得分:4)
一个市长的区别在于,如果您拨打await
的帖子有SynchronizationContext
,await
默认会在SynchronizationContext
内安排继续。所以在等待之后,你将回到与以前相同的线程。您可以使用.ConfigureAwait(false)
更改它。
使用.ContinueWith()
它是另一种方式,默认情况下它将被安排在一个aribitary(线程池)线程上,除非你将TaskScheduler.FromCurrentSynchronizationContext()
传递给它。