C# 不包含';GetWaiter';调用异步方法时

C# 不包含';GetWaiter';调用异步方法时,c#,async-await,C#,Async Await,我得到了编译器错误 CS1061“MAUserVM”不包含“GetWaiter”和 没有可访问的扩展方法“GetWaiter”接受第一个参数 找不到类型为“MAUserVM”的(是否缺少using指令 或程序集引用?) 异步方法 public class MAUserVM { public string AuthenticationStatus; public MAUser mAUser; public async Task<MAUserVM> GetMA

我得到了编译器错误

CS1061“MAUserVM”不包含“GetWaiter”和 没有可访问的扩展方法“GetWaiter”接受第一个参数 找不到类型为“MAUserVM”的(是否缺少using指令 或程序集引用?)

异步方法

public class MAUserVM
{
    public string AuthenticationStatus;

    public MAUser mAUser;

    public async Task<MAUserVM> GetMAUserAsync(string Email, string Password, IConfiguration configuration, IHttpContextAccessor accessor)
    {
        ...
    }
}
private async Task<Boolean> AuthenticateUser(string email, string password)
{
    ...

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

    ...
}
公共类MAUserVM
{
公共字符串身份验证状态;
公共毛瑟毛瑟;
公共异步任务GetMAUserAsync(字符串电子邮件、字符串密码、IConfiguration配置、IHttpContextAccessor访问器)
{
...
}
}
调用方法

public class MAUserVM
{
    public string AuthenticationStatus;

    public MAUser mAUser;

    public async Task<MAUserVM> GetMAUserAsync(string Email, string Password, IConfiguration configuration, IHttpContextAccessor accessor)
    {
        ...
    }
}
private async Task<Boolean> AuthenticateUser(string email, string password)
{
    ...

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

    ...
}
private async Task AuthenticateUser(字符串电子邮件、字符串密码)
{
...
//这里发生了例外情况
userVM=await userVM.GetMAUserAsync(电子邮件、密码、\u配置、\u访问器)。结果;
...
}

这是什么原因造成的?

修复程序

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

短篇小说

您正在调用
任务的
结果
,该任务返回
T
(又称
MAUserVM
),然后尝试
等待它


长话短说

您可以
await
公开
GetAwaiter
的任何实例(作为实例方法或扩展方法)。
GetAwaiter
需要实现
INotifyCompletion
接口(以及可选的
ICriticalNotifyCompletion
接口),并返回一个本身公开多个成员的类型<代码>任务
就是实现上述功能的对象之一(这就是为什么您可以
等待它的原因)

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

获取此
任务的结果值

更多信息

在现代的.Net中,如果你发现你的自我调用
结果
等待
或类似的黑客行为,总是想自己有一个更好的方法,那就是 通常只需呼叫
等待
。如果忽略此建议,则可能会阻塞异步方法,并发现自己存在死锁、复杂的聚合异常或难以调试的问题


其他资源