测试await运算符是否会成功

时间:2016-11-18 21:46:56

标签: c# asynchronous async-await

await/async环境中是否有任何功能可以测试await是否会暂停方法/阻止?或者这种模式中没有包含这样的功能?

2 个答案:

答案 0 :(得分:2)

您可以检查IsCompleted上的Task以查看它是否已完成(如果已完成,则该方法不会被暂停)。但是,虽然您可以可靠地确定不需要继续,但是您永远无法可靠地确定 是否必要,只是因为您检查Task是否完成并看到它后面的那一刻&# 39; s尚未完成,它可以完成,导致该方法没有返回给调用者(还)。

答案 1 :(得分:2)

对于要等待的东西,它必须有一个名为GetAwaiter()的函数,并且返回的对象必须follow a specific pattern。模式的一部分是它必须具有公共属性bool IsCompleted { get; }

var awaiter = foo.GetAwaiter();
if(awaiter.IsCompleted)
{
    //You know for sure awaiting foo will not cause a context change
}
else
{
    //Awaiting will likely cause a context change but the value of IsCompleted 
    // could change between the "if" check and the await call.
}

await foo;