2016-07-25 141 views
4

我在下面的代碼集中得到下面的錯誤,它在'alliancelookup'行錯誤,我不知道我做錯了什麼,但我不能看到自己的任何事查詢即時運行到波峯似乎運行良好,但它似乎是問題與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(封閉,調用點,對象) 在System.Dynamic定義.UpdateDelegates.UpdateAndExecute1 [T0,TRet](CallSite站點,T0 arg0) at ***。Program。 <> c。 < b__2_10> d.MoveNext()在C:\用戶--- \文檔\ Visual Studio的2015年\項目------ \的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荷蘭國際集團與工作不事這並不意味着要編輯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

0

你還有一個比你需要的更多。你只需要等待異步方法,但你也在等待結果,這顯然聲明類型是dynamic。這就是爲什麼你沒有收到編譯時錯誤。

使用dynamic它會嘗試綁定運行時需要的方法。使用異步當該方法是.GetAwaiter()中,因此RuntimeBinderException「不包含一個定義‘GetAwaiter’」

這就是說,第三行應該是:

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

雖然分手瞭如Stephen Cleary建議的是一種更好的做法。

相關問題