Не содержит определения для "GetAwaiter"
Я получаю приведенную ниже ошибку с указанным ниже набором кода. Это ошибка в строке '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" не содержит определения для "GetAwaiter" в CallSite.Target(Closure, CallSite, Object) в System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,TRet](site, T0 arg0) в ***. Program.<> c.
d.MoveNext () в C:\Users---\Documents\Visual Studio 2015\Projects------\Program.cs: строка 95
3 ответа
Невозможно точно знать, что не так без минимального, полного, проверяемого примера, но похоже, что вы 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
,
Вас ждут еще больше, чем вам нужно. Вам нужно только дождаться асинхронных методов, но вы также ожидаете результата, который явно объявлен как dynamic
, Вот почему вы не получаете ошибку времени компиляции.
С dynamic
он попытается связать метод, который необходим во время выполнения. Этот метод при использовании async -.GetAwaiter(), поэтому RuntimeBinderException "не содержит определения для" GetAwaiter ""
Тем не менее, третья строка должна быть:
var alliancelookup = (await root.GetAsync(r => r.alliances)).First(i => i.shortName == e.GetArg("allianceticker").ToUpper());
Хотя расщепление, как предложено Стивеном Клири, является лучшей практикой.
Вы ожидаете асинхронного вызова, поэтому вы должны поместить асинхронную задачу в начало метода, где вы вызываете этот код
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;