我正在尝试将文件列表复制到一个目录中。 我正在使用async / await。 但是我一直收到这个编译错误:
'await'操作符只能在异步lambda表达式中使用。请考虑使用'async'修饰符标记此lambda表达式。
这是我的代码:
async Task<int> CopyFilesToFolder(List<string> fileList,
IProgress<int> progress, CancellationToken ct)
{
int totalCount = fileList.Count;
int processCount = await Task.Run<int>(() =>
{
int tempCount = 0;
foreach (var file in fileList)
{
string outputFile = Path.Combine(outputPath, file);
await CopyFileAsync(file, outputFile); //<-- ERROR: Compilation Error
ct.ThrowIfCancellationRequested();
tempCount++;
if (progress != null)
{
progress.Report((tempCount * 100 / totalCount)));
}
}
return tempCount;
});
return processCount;
}
private async Task CopyFileAsync(string sourcePath, string destinationPath)
{
using (Stream source = File.Open(sourcePath, FileMode.Open))
{
using (Stream destination = File.Create(destinationPath))
{
await source.CopyToAsync(destination);
}
}
}
请问有人能指出我错过了什么吗?
async
关键字吗?基本上,如果你将lambda表达式提取到Task.Run
内部,它将不是一个async
方法,因此你无法等待结果。 - Daniel Kelleyawait Task.Run<int>(() => ...
-- lambda表达式不是async
。 - JonTask.Run
,因为它只有IO限制。请查看http://pastebin.com/p83gkkTk获取示例解决方案(我会将其作为答案发布,但已关闭)。 - Tim S.