正如我所看到的几个coding examples,还有,我可以从这个SO question明白我应该能够从TaskCompletionSource返回任务,而不是任务<TResult>从TaskCompletionSource
(i.e., Return Task and not Task<TResult> from the method UploadFilesAsync)
返回一个非通用任务然而,下面的代码:
public async Task UploadFilesAsync(string fileAPath, string fileBPath)
{
var tcs = new TaskCompletionSource<Object>();
//logic to process files
try
{
await Task.WhenAll(uploadFileAAsync(fileAPath),
uploadFileBAsync(fileBPath));
tcs.TrySetResult(null);
}
catch (Exception e)
{
tcs.SetException(e);
}
finally
{
//logic to clean up files
}
return tcs.Task;
}
产生如下的语法错误
'UploadFilesAsync(string, string)' is an async method that returns 'Task',
a return keyword must not be followed by an object expression.
Did you intend to return 'Task<T>'?
我针对.NET 4.5。我知道它可以返回任务(对象),但这会让API感觉“脏”。返回任务(对象)还是有可能返回任务(代码中显示的非泛型)是否是首选实践?
我必须解压缩文件,运行上传,然后删除解压后的文件。我希望上传运行异步,这就是为什么我将它们包装在taskcompletionsource中,或者我会按照您的建议完成。这是有道理的,异步包装在另一个任务中的回报(难怪用async/await看到一个工作示例很难)。谢谢! – 2013-04-26 06:27:58
@JonathanHarrison:只是为了检查 - 你是否明白为什么你能按我的建议做,而且它仍然是异步的?我会补充一点,这可能会有所帮助... – 2013-04-26 06:38:24
非常感谢您的编辑。这个概念最初没有点击过......非常美妙,async/await实际上处理了这样的异步无效方法。 – 2013-04-26 06:52:28