2016-07-25 7 views
4

Im получает ошибку ниже с приведенным ниже набором кода. Это ошибка в строке «alliancelookup», я не уверен, что я делаю неправильно, но я не мог видеть что угодно. Запрос im, выполняющийся на crest, кажется, работает нормально, но похоже, что проблема с империей связана с Awaiter, мне было интересно, есть ли способ обойти это?не содержит определения для «GetAwaiter»

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 (закрытие, CallSite, Object) в System.Dynamic .UpdateDelegates.UpdateAndExecute1 [T0, TRet] (сайт CallSite, T0 arg0) в программе ***. <> c. < b__2_10> d.MoveNext() в C: \ Users --- \ Documents \ Visual Studio 2015 \ Projects ------ \ Program.cs: строка 95

+0

Это поможет узнать, что такое линия 95. Ошибка, которую вы получаете, довольно прямолинейна. То, что когда-либо было объектом, которое вы пытаетесь «ожидать», неправильно реализует метод GetAwaiter, необходимый для работы. – Nitram

ответ

0

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

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; 
+5

Если не было 'async', была бы ошибка компиляции, а не время выполнения. – GSerg

5

это не возможно, чтобы точно знать, что случилось без minimal, complete, verifiable example, но это выглядит, как вы await ING то, что ISN 't должно быть await ed.

дробя 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.

0

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

С помощью dynamic он попытается связать метод, необходимый во время выполнения. Этот метод при использовании асинхра является .GetAwaiter(), оператор, таким образом, RuntimeBinderException «не содержит определение для„GetAwaiter“»

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

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

Несмотря на то, как раскалывается предложенный Стивеном Клири, является лучшей практикой.

Смежные вопросы