web-dev-qa-db-ja.com

'await'演算子は非同期ラムダ式でのみ使用できます

ファイルのリストをディレクトリにコピーしようとしています。私はasync/awaitを使用しています。しかし、私はこのコンパイルエラーを受け取っています

'await'演算子は、非同期ラムダ式内でのみ使用できます。このラムダ式を 'async'修飾子でマークすることを検討してください。

これは私のコードがどのように見えるかです

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);
        }
    }

}

Plsは誰が私がここで何を欠いているのか指摘できますか?

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

する必要があります

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

lambdamethodを定義するための省略形であることに注意してください。したがって、外部メソッドはasyncですが、この場合はラムダ内でawaitを使用しようとしています(これは外部メソッドより異なるメソッドです)。 。したがって、ラムダもasyncとマークする必要があります。

31
Stephen Cleary