我一直认为如果我调用一个异步函数,线程就会开始执行这个异步函数,直到它看到一个等待。我认为它会向上调用堆栈查看调用者是否没有等待,而不是无所事事地等待。如果没有,则执行代码。
考虑以下(简化的)代码:
async Task<string> FetchCustomerNameAsync(int customerId)
{
// check if customerId is positive:
if (customerId <= 0) throw new ArgumentOutofRangeException(nameof(customerId);
// fetch the Customer and return the name:
Customer customer = await FetchCustomerAsync(customerId);
return customer.Name;
}
现在,如果我的异步函数FetchCustomerNameAsync(+1)不等待就调用会发生什么:
var myTask = FetchCustmerNameAsync(+1);
DoSomethingElse();
string customerName = await myTask;
FetchCustomerNameAsync, 以 +1 的参数值调用
FetchCustomerNameAsync检测到它customerId是阳性的,所以也不例外
FetchCustomerNameAsync 电话 FetchCustomerAsync
里面的某个地方FetchCustomerAsync是一个等待。发生这种情况时,线程会向上调用调用堆栈,直到其中一个调用者没有等待。
FetchCustomerNameAsync 正在等待,所以调用堆栈
我的功能还没有等待,继续 DoSomethingElse()
我的功能满足等待。
我的想法是,在满足我函数中的 await 之前,已经完成了对参数值的检查。
因此,以下应在 await 之前导致异常:
// call with invalid parameter; do not await
var myTask = FetchCustmerNameAsync(-1); // <-- note the minus 1!
Debug.Assert(false, "Exception expected");
我认为虽然我没有等待,但在Debug.Assert.
然而,在我的程序中,在 Debug.Assert为什么之前没有抛出异常?到底发生了什么?
繁星淼淼
慕莱坞森
catspeake
相关分类