【发布时间】:2013-10-10 00:53:44
【问题描述】:
(问题的真正标题应该是“为什么我会得到一个'无法将'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;
}
所以,这里实际上有一个 链 任务 - “内部”任务将是一个任务,然后将传播到调用者,并转换为一个任务(即一个任务没有结果)。我想这可能会导致手头的问题?
如果我把最外层的代码改成这样:
var task = DownloadFileAsync(file, targetFolder, uri);
task.Wait();
...它完美无缺。为什么?
【问题讨论】:
标签: c# .net async-await c#-5.0