5

我用下面的代码集得到了下面的错误,它在“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' 不包含 System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,Tret](CallSite站点,T0 arg0) 在 ***.Program.<>c.<b__2_10>d.MoveNext() 在 C:\Users---\Documents\Visual Studio 2015\Projects------\Program.cs :第 95 行

4

3 回答 3

6

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

于 2016-07-25T20:06:10.927 回答
2

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

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

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

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

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

于 2016-09-22T19:24:41.267 回答
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;
于 2016-07-25T14:47:29.610 回答