2013-10-03 99 views
3

(問題的真正標題應該是「爲什麼我會得到'無法投射類型'System.Runtime.CompilerServices.TaskAwaiter`1 [System.Runtime.CompilerServices.VoidTaskResult]'的對象來鍵入'System.Runtime .CompilerServices.INotifyCompletion'」,但不幸的是這是StackOverflow的太長。:)爲什麼在等待任務返回方法時出現InvalidCastException?

嗨,

試圖await我的一個方法的執行時,我變得非常奇特的問題。調用代碼如下所示(節選):

private async Task DownloadAddonFileAsync(dynamic addon, dynamic file, string targetFolder) 
    { 
     // ... 
     await DownloadFileAsync(file, targetFolder, uri); 

的DownloadFileAsync看起來是這樣的:

protected async Task DownloadFileAsync(dynamic file, string targetFolder, string uri) 
    { 
     // ... 
     var fileBytes = await AppLoaderRestClient.GetAsync<byte[]>(uri); 

的AppLoaderRestClient.GetAsync(),反過來,看起來是這樣的:

public static async Task<T> GetAsync<T>(string uri) 
    { 
     // ... 
     if (typeof (T) == typeof (byte[])) 
     { 
      var result = await webClient.DownloadDataTaskAsync(uri); 
      return (T) (object) result; 
     } 

因此,這裏實際上有一個任務鏈 - 「內部」任務將是一個任務,然後將其傳播給調用者,並轉換爲Tas k(即沒有結果的任務)。我認爲這可能導致手頭的問題?

如果我改變最代碼這樣:

 var task = DownloadFileAsync(file, targetFolder, uri); 
     task.Wait(); 

...它完美的作品。爲什麼?

回答

8

正如它有時會發現,我設法找到問題的答案,同時在這裏發佈它。以爲我會分享它來拯救別人頭痛......

這個問題源於我使用動態,或者更確切地說(在我看來)在C#/。NET中動態工作尚未。如果我以這種方式重新編寫我的代碼:

await (Task)DownloadFileAsync(file, targetFolder, uri); 

...它完美地工作。

這裏的事情是因爲我的一個參數(file是動態的),這將是一個動態操作。並且返回值似乎以某種方式被動態操作「搞亂」; CLR根本無法從上面的代碼中推導出該方法是否返回TaskTask<T>(或者我猜)。因此,它試圖將結果轉換爲INotifyCompletion實例失敗 - 因此,例外。

謝謝lot,Microsoft。 ;)
(我認爲這裏的主要問題是,例外消息是非常不清楚,在我看來......)

相關問題