不包含“GetAwaiter”的定义。

5

我在使用下面的代码时遇到了以下错误,它在'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 site, T0 arg0) 处更新和执行 在 ***.Program.<>c.<b__2_10>d.MoveNext() 中移动到 C:\Users---\Documents\Visual Studio 2015\Projects------\Program.cs 的第 95 行。

知道第95行是什么会有所帮助。你得到的错误非常直接。无论你试图await的对象没有正确实现所需的GetAwaiter方法,这是整个过程工作所必需的。 - Nitram
3个回答

7

如果没有一个最小化、完整化、可验证的示例,就不可能确切地知道问题出在哪里,但看起来你正在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


2
您有一个比所需多的等待。您只需要等待异步方法,但您也在等待结果,而该结果声明类型显然为dynamic。这就是为什么您没有得到编译时错误的原因。
使用dynamic时,将在运行时尝试绑定需要的方法。当使用async时,该方法为.GetAwaiter(),因此会出现RuntimeBinderException“不包含'GetAwaiter'的定义”。
也就是说,第三行应该是:
var alliancelookup = (await root.GetAsync(r => r.alliances)).First(i => i.shortName == e.GetArg("allianceticker").ToUpper());

尽管像Stephen Cleary建议的那样拆分是更好的实践方法。

这对我很有帮助。我正在等待异步方法的结果(method.Result),其声明类型为dynamic。移除 .Result 后,问题得到解决。 - lexma

0
你正在等待一个异步调用,因此必须在调用此代码的方法开头放置 async Task。
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;

7
如果没有async,就会出现编译错误而不是运行时错误。 - GSerg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接