等待v.s之后放置代码有什么区别使用ContinueWith

时间:2017-03-29 05:28:29

标签: c# asynchronous

根据我的理解,如果等待异步函数,则以下代码将包装在委托中并在异步函数返回后执行:

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;
                    });
}

这两种实现之间是否存在差异?

1 个答案:

答案 0 :(得分:4)

一个市长的区别在于,如果您拨打await的帖子有SynchronizationContextawait默认会在SynchronizationContext内安排继续。所以在等待之后,你将回到与以前相同的线程。您可以使用.ConfigureAwait(false)更改它。

使用.ContinueWith()它是另一种方式,默认情况下它将被安排在一个aribitary(线程池)线程上,除非你将TaskScheduler.FromCurrentSynchronizationContext()传递给它。