2016-07-25 8 views
4

Ich bekomme den untenstehenden Fehler mit dem folgenden Satz von Code, Es ist auf der 'Alliancelookup' Zeile Fehler, ich bin mir nicht sicher, was ich falsch mache, aber ich konnte nicht sehe selbst etwas. Die Frage, die zum Kamm läuft, scheint gut zu laufen, aber es scheint, dass das Problem mit dem Awaiter ist, ich habe mich gefragt, ob es einen Weg um das gab?enthält keine Definition für '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' enthält keine Definition für 'GetAwaiter' bei CallSite.Target (Closure, CallSite, Object) bei System.Dynamic .UpdateDelegates.UpdateAndExecute1 [T0, TRet] (CallSite-Site, T0 arg0) bei ***. Programm. <> c. < b__2_10> d.MoveNext() in C: \ Benutzer --- \ Dokumente \ Visual Studio 2015 \ Projects ------ \ Program.cs: Linie 95

+0

Es wäre hilfreich zu wissen, welche Zeile 95 ist. Der Fehler, den Sie bekommen, ist ziemlich einfach. Jedes Objekt, das Sie versuchen zu "warten", implementiert die "GetAwaiter" -Methode, die für das while-Verfahren erforderlich ist, nicht richtig. – Nitram

Antwort

0

Du einen asyn Anruf wartet so Sie müssen Asynchron-Aufgabe zu Beginn des Verfahrens stellen, wo Sie diesen Code aufrufen

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

Wenn es nicht 'async' gäbe, gäbe es einen Kompilierungsfehler, nicht einen Laufzeitfehler. – GSerg

5

es ist nicht möglich, genau zu wissen, was ohne minimal, complete, verifiable example falsch ist, aber es sieht wie Sie await etwas ing, das isn 't soll sein await ed.

Aufspaltung die alliancelookup Linie:

// 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()); 

Es kann ein besserer Ansatz sein, die Filter in den Asynchron-Code bewegen, aber das hängt von DynamicCrest.

0

Sie haben eine weitere erwarten als was Sie brauchen. Sie müssen nur auf die asynchronen Methoden warten, aber Sie warten auch auf das Ergebnis, das offenbar als Typ dynamic deklariert wurde. Aus diesem Grund erhalten Sie keinen Fehler bei der Kompilierung.

Mit dynamic wird versucht, die zur Laufzeit benötigte Methode zu binden. Dieses Verfahren, wenn async Verwendung .GetAwaiter ist(), eine damit die RuntimeBinderException „enthält keine Definition für‚GetAwaiter‘“

Das heißt, sollte die dritte Zeile sein:

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

Obwohl Aufspaltung als von Stephen Cleary vorgeschlagen ist eine bessere Praxis.