не содержит определения 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' не содержит определения для 'GetAwaiter' в CallSite.Target (Closure, CallSite, Object) в System.Dynamic.UpdateDelegates.UpdateAndExecute1 [T0, TR site, T0 arg0) в ***. Program. ‹> c. ‹b__2_10> d.MoveNext () в C: \ Users --- \ Documents \ Visual Studio 2015 \ Projects ------ \ Program.cs : строка 95


person Community    schedule 25.07.2016    source источник
comment
Было бы полезно узнать, что такое строка 95. Ошибка, которую вы получаете, довольно проста. Какой бы объект вы ни пытались await, не реализует должным образом GetAwaiter метод, который требуется для работы while.   -  person Nitram    schedule 26.07.2016


Ответы (3)


Невозможно точно узнать, что не так, без минимального, полного, поддающегося проверке примера, но похоже, что вы await переживаете что-то, что не предназначен для awaited.

Разделение строки 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.

person Stephen Cleary    schedule 25.07.2016

У вас на одно ожидание больше, чем вам нужно. Вам нужно только дождаться асинхронных методов, но вы также ожидаете результата, который, по-видимому, объявлен типом dynamic. Вот почему вы не получаете ошибку времени компиляции.

С dynamic он попытается связать метод, который нужен во время выполнения. Этот метод при использовании async - это .GetAwaiter (), поэтому RuntimeBinderException "не содержит определения для 'GetAwaiter'"

Тем не менее, третья строка должна быть:

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

Хотя разделение, предложенное Стивеном Клири, - лучшая практика.

person fbiagi    schedule 22.09.2016
comment
Это мне помогло. Я ждал результата асинхронного метода (method.Result), который объявил тип dynamic. Удаление .Result сработало. - person lexma; 07.09.2020

Вы ожидаете асинхронного вызова, поэтому вам нужно поместить асинхронную задачу в начало метода, в котором вы вызываете этот код.

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;
person Mostafiz    schedule 25.07.2016
comment
Если бы не было async, возникла бы ошибка компиляции, а не выполнения. - person GSerg; 25.07.2016