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' には、System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,TRet](CallSite の CallSite.Target(Closure , CallSite , Object ) で 'GetAwaiter' の定義が含まれていませんサイト、T0 arg0) at ***.Program.<>c.<b__2_10>d.MoveNext() in 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

必要なものよりも 1 つ多く待機しています。非同期メソッドを待機するだけで済みますが、明らかに宣言された型が である結果も待機していますdynamic。そのため、コンパイル時エラーが発生しません。

これによりdynamic、実行時に必要なメソッドをバインドしようとします。非同期を使用する場合のそのメソッドは .GetAwaiter() であるため、RuntimeBinderException には「'GetAwaiter' の定義が含まれていません」

つまり、3 行目は次のようになります。

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 に答える