2015-08-13 24 views
0

我有這樣GetAwaiter()方法

  var results = await client 
       .For(x.Offices) 
       .Select(x.NumberOfFlores, x.Hight) 
       .QueryAsync(); 

客戶端的頂級功能是我自己的功能,做了一堆東西。 (與ODataClient客戶端類不一樣)

QueryAsync()的結果返回一個自定義類。這個類有幾個參數,其中之一是queryResults。這個類有一個GetAwaiter()函數,它永遠不能正常工作。

public async Task GetAwaiter() 
{ 
     await queryResults; 
} 

queryResults是類型的對象Task<IEnumerable<ODataEntry>>

什麼,我希望它做的是等待queryResults來執行,所以比我可以在表單中使用它results.QueryResults

不過,我得到「await queryResults」後出現此錯誤

無法投射 類型的對象'System.Threading.Tasks.Task`1 [Sys tem.Threading.Tasks.VoidTaskResult]' 鍵入'System.Runtime.CompilerServices.INotifyCompletion'。

getAwaiter函數確實執行,但是一旦我從它返回,我就會收到一個錯誤。

我已經嘗試了一堆不同的東西,但沒有任何工作。我究竟做錯了什麼?

+1

爲什麼你有自己的'GetAwaiter'方法?我想你需要退後一步,問問自己你想做什麼。 '任務'不是等待者,他們是可以等待的 - 只要讓你的'QueryAsync'返回一個'Task',並且完成它。 – Luaan

+0

我不能這樣做,因爲我需要返回多個東西,而不僅僅是一個任務。因此,我做了一個數據結構,其中包含幾個參數。其中之一是這個任務,它需要等待頂級類別調用「await」 – user2824991

+1

@ user2824991然後,您應該等待該對象的Task屬性,而不是對象本身。 – Servy

回答

1

Task不是一個服務員,這是一個等待。這意味着你不能從你的GetAwaiter方法中退還 - 它不符合合同。

如果你真的想要去的這條路(我真的不明白這一點),請確保您的GetAwaiter實際返回的awaiter:

public TaskAwaiter<IEnumerable<ODataEntry>> GetAwaiter() 
{ 
    return queryResults.GetAwaiter(); 
} 

編輯:

如果您想要返回一個不同類型的任務,你需要返回一個不同類型的任務 - 這是沒有辦法的。這種惡臭糟糕的設計,但你可以做這樣的事情:

public TaskAwaiter<Tuple<YourObject, IEnumerable<ODataEntry>>> GetAwaiter() 
{ 
    return 
    queryResults 
    .ContinueWith(t => Tuple.Create(this, t.Result)) 
    .GetAwaiter(); 
} 

這將返回兩個查詢對象和結果的元組的兩個獨立的特性 - 當然,你可以使用任何其他類型的你」喜歡。不過,我仍然強烈建議重新考慮你目前的設計 - 看起來就像一兩年內會讓你頭疼的那種。

+0

我不想返回任務。我有一個具有多個屬性的自定義類,我想訪問它。其中之一就是所說的「任務」。當您在頂級課程中調用「await」時,我想要處理我的自定義課程中的「任務」。 – user2824991

+0

@ user2824991您可以將您需要的任何其他值返回 - 檢查我的更新。我只是修正了你的'GetAwaiter'代碼,因爲它沒有任何意義 - 當你試圖返回一個任務時,它必須返回一個awaiter。事實上,你可以很容易地讓你的整個查詢對象成爲一個服務器,但這只是深入挖掘問題。 – Luaan

相關問題