(質問の本当のタイトルは、「'System.Runtime.CompilerServices.TaskAwaiter`1[System.Runtime.CompilerServices.VoidTaskResult] 型のオブジェクトをキャストできません」を「System.Runtime.CompilerServices 型にキャストできないのはなぜですか?」 .INotifyCompletion'" ですが、残念ながら、これは StackOverflow には長すぎます。:)
やあ、
私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;
}
したがって、実際にはここに Task のチェーンがあります。「内部」Task は Task になり、呼び出し元に伝播され、Task (つまり、結果のない Task) に変換されます。これが目前の問題を引き起こしている可能性があると思いますか?
最も外側のコードを次のように変更すると:
var task = DownloadFileAsync(file, targetFolder, uri);
task.Wait();
...問題なく動作します。なんで?