不包含'GetAwaiter'的定义

时间:2016-07-25 14:45:42

标签: c# async-await api-eveonline

我使用下面的代码集得到以下错误,这是'alliancelookup'行上的错误,我不确定我做错了什么,但我自己也看不到任何东西。运行到顶部的查询似乎运行正常,但似乎我遇到的问题是Awaiter,我想知道是否有办法解决这个问题?

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(Closure,CallSite,Object)      在System.Dynamic.UpdateDelegates.UpdateAndExecute1 [T0,TRet](CallSite站点,T0 arg0)      at ***。程序。<> c。< b__2_10> d.MoveNext()在C:\ Users --- \ Documents \ Visual Studio 2015 \ Projects ------ \ Program.cs:line 95

3 个答案:

答案 0 :(得分:6)

如果没有minimal, complete, verifiable example,就不可能确切地知道出了什么问题,但看起来你await的内容似乎不是await

分割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

答案 1 :(得分:1)

你还有一个等待你需要的东西。您只需等待异步方法,但您也在等待结果,显然声明类型为dynamic。这就是为什么你没有得到编译时错误。

使用dynamic,它将尝试绑定运行时需要的方法。使用异步的方法是.GetAwaiter(),因此RuntimeBinderException"不包含' GetAwaiter'"

的定义

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

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

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

答案 2 :(得分:0)

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

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;