'await'运算符只能与async lambda表达式一起使用

时间:2014-09-10 14:37:51

标签: c# async-await .net-4.5

我正在尝试将文件列表复制到目录中。我正在使用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);
        }
    }

}

请问有谁可以指出我在这里缺少什么?

1 个答案:

答案 0 :(得分:28)

int processCount = await Task.Run<int>(() =>

应该是

int processCount = await Task.Run<int>(async () =>

请记住, lambda 只是定义方法的简写。因此,您的外部方法是async,但在这种情况下,您尝试在lambda中使用await(这是一种不同的方法而不是外部方法)。所以你的lambda也必须标记为async