【问题标题】:Does not contain a definition for 'GetAwaiter' while calling async method [duplicate]调用异步方法时不包含“GetAwaiter”的定义[重复]
【发布时间】:2020-10-23 00:02:59
【问题描述】:

我收到编译器错误

CS1061“MAUserVM”不包含“GetAwaiter”的定义,并且 没有可访问的扩展方法“GetAwaiter”接受第一个参数 可以找到“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;

    ...
}

这是什么原因造成的?

【问题讨论】:

    标签: c# async-await


    【解决方案1】:

    修复

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

    短篇小说

    您在Task 上调用Result,它返回T(又名MAUserVM),然后尝试await 它。


    长篇大论

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

    编译器错误告诉您MAUserVM 没有GetAwaiter 方法,因为您已经使用TaskTask 检索到它(结果Result 方法。

    获取此Task&lt;TResult&gt; 的结果值。

    更多

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


    其他资源

    Stephen Cleary - Don't Block on Async Code

    【讨论】:

      猜你喜欢
      • 2019-02-01
      • 1970-01-01
      • 2021-07-24
      • 2012-08-04
      • 2017-04-20
      • 2017-11-20
      • 2018-08-21
      • 2016-12-15
      • 2017-04-08
      相关资源
      最近更新 更多