【问题标题】:does not contain a definition for 'GetAwaiter'不包含“GetAwaiter”的定义
【发布时间】:2016-07-25 14:45:42
【问题描述】:

使用下面的代码集出现以下错误,“alliancelookup”行出错,我不确定自己做错了什么,但我自己什么也看不到。我正在运行的查询似乎运行良好,但我遇到的问题似乎与等待者有关,我想知道是否有办法解决这个问题?

DynamicCrest crest = new DynamicCrest();
var root = await crest.GetAsync(crest.Host);
var alliancelookup = await (await root.GetAsync(r => r.alliances)).First(i => i.shortName == e.GetArg("allianceticker").ToUpper());
allianceid = alliancelookup.id;

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:“System.Dynamic.ExpandoObject”不包含“GetAwaiter”的定义 在 CallSite.Target(闭包,CallSite,对象) 在 System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,Tret](CallSite 站点,T0 arg0) 在 ***.Program.c.d.MoveNext() 在 C:\Users---\Documents\Visual Studio 2015\Projects------\Program.cs:line 95

【问题讨论】:

  • 知道第 95 行是什么会有所帮助。您得到的错误非常简单。您尝试await 的任何对象都没有正确实现while 工作所需的GetAwaiter 方法。

标签: c# async-await api-eveonline


【解决方案1】:

如果没有minimal, complete, verifiable example,就不可能确切地知道哪里出了问题,但看起来你确实在awaiting 一些不应该是awaited 的东西。

拆分alliancelookup 行:

// Asynchronously retrieve the alliances.
var alliances = await root.GetAsync(r => r.alliances);

// Synchronously get the first matching one.
var allianceLookup = alliances.First(i => i.shortName == e.GetArg("allianceticker").ToUpper());

可能有更好的方法,将过滤器移到异步代码中,但这取决于DynamicCrest

【讨论】:

    【解决方案2】:

    您的等待比您需要的多。你只需要等待异步方法,但你也在等待结果,显然声明的类型是dynamic。这就是您没有收到编译时错误的原因。

    dynamic 会尝试绑定运行时需要的方法。使用异步时的该方法是 .GetAwaiter(),因此 RuntimeBinderException“不包含 'GetAwaiter' 的定义”

    也就是说,第三行应该是:

    var alliancelookup = (await root.GetAsync(r => r.alliances)).First(i => i.shortName == e.GetArg("allianceticker").ToUpper());
    

    尽管按照 Stephen Cleary 的建议拆分是一种更好的做法。

    【讨论】:

    • 这对我有帮助。我正在等待异步方法的结果(method.Result),它声明了动态类型。删除 .Result 有效。
    【解决方案3】:

    您正在等待异步调用,因此您必须将异步任务放在调用此代码的方法的开头

    public async Task<returntyp> Name()
    {
      DynamicCrest crest = new DynamicCrest();
      var root = await crest.GetAsync(crest.Host);
      var alliancelookup = await (await root.GetAsync(r => r.alliances)).First(i => i.shortName == e.GetArg("allianceticker").ToUpper());
      allianceid = alliancelookup.id;
    

    【讨论】:

    • 如果没有async,就会出现编译错误,而不是运行时错误。
    猜你喜欢
    • 2012-08-04
    • 2017-04-20
    • 2017-11-20
    • 2018-08-21
    • 2016-12-15
    • 2017-04-08
    • 1970-01-01
    • 2023-01-09
    • 2020-08-21
    相关资源
    最近更新 更多