调用异步方法时不包含“GetAwaiter”的定义

Win*_*Guy -1 c# async-await

我收到编译器错误

CS1061“MAUserVM”不包含“GetAwaiter”的定义,并且找不到接受“MAUserVM”类型的第一个参数的可访问扩展方法“GetAwaiter”(您是否缺少 using 指令或程序集引用?)

异步方法

public class MAUserVM
{
    public string AuthenticationStatus;

    public MAUser mAUser;

    public async Task<MAUserVM> GetMAUserAsync(string Email, string Password, IConfiguration configuration, IHttpContextAccessor accessor)
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

调用方法

private async Task<Boolean> AuthenticateUser(string email, string password)
{
    ...

    // exception happening here
    userVM = await userVM.GetMAUserAsync(email, password, _configuration, _accessor).Result;

    ...
}
Run Code Online (Sandbox Code Playgroud)

是什么原因造成的?

AAA*_*ddd 7

修复

//userVM = await userVM.GetMAUserAsync(email, password, _configuration, _accessor).Result;
userVM = await userVM.GetMAUserAsync(email, password, _configuration, _accessor);
Run Code Online (Sandbox Code Playgroud)

短篇故事

您正在调用返回(又名)的Resulta ,然后尝试它。TaskTMAUserVMawait


故事很长

您可以公开await任何实例GetAwaiter(作为实例方法或扩展方法)。AGetAwaiter需要实现INotifyCompletion接口(以及可选的ICriticalNotifyCompletion接口)并返回一个本身公开多个成员的类型。Task就是一个实现上述内容的对象(这就是为什么你可以await这样做)

编译器错误告诉您MAUserVM没有该GetAwaiter方法,因为您已经通过使用该方法检索了它(结果) 。TaskResult

获取 this 的结果值Task<TResult>

此外

现代.Net中,如果您发现自己的自我调用ResultWait类似的黑客行为,请始终认为自己有更好的方法,而这种方法通常只是调用await。如果您忽略此建议,您可能会阻塞异步方法,并发现自己遇到死锁、复杂的聚合异常或难以调试的问题。


其他资源

Stephen Cleary - 不要阻止异步代码