不包含’GetAwaiter’的定义

我用下面的代码集得到了下面的错误,这是’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’在System.Dynamic.UpdateDelegates.UpdateAndExecute1 [T0,TRet](CallSite)的CallSite.Target(Closure,CallSite,Object)中不包含’GetAwaiter’的定义网站,T0 arg0)at ***。程序。 c。 d.MoveNext()在C:\ Users — \ Documents \ Visual Studio 2015 \ Projects —— \ Program.cs :第95行

如果没有一个最小的,完整的,可validation的例子 ,就不可能确切地知道出了什么问题,但它确实看起来像是在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()); 

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

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

使用dynamic ,它将尝试绑定运行时需要的方法。 使用async时的方法是.GetAwaiter(),因此RuntimeBinderException“不包含’GetAwaiter’的定义”

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

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

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

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

 public async Task 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; 
Interesting Posts