Asp.net mvc 4 MVC4应用程序上的Task.WaitAll(…)块

Asp.net mvc 4 MVC4应用程序上的Task.WaitAll(…)块,asp.net-mvc-4,io,task-parallel-library,async-await,Asp.net Mvc 4,Io,Task Parallel Library,Async Await,在MVC4应用程序中,我有一个将文件复制到目标文件夹的任务。因为我有多个文件,所以我为每个文件创建一个任务,我想等到它们全部完成。问题是我在Task.WaitAllcopyingTasks.ToArray的代码块好像任务永远不会结束,所以它永远不会通过那行代码。下面是示例代码: private void CopyFilesFromWorkingCopyForProject(string projectName) { var copyingTasks = new L

在MVC4应用程序中,我有一个将文件复制到目标文件夹的任务。因为我有多个文件,所以我为每个文件创建一个任务,我想等到它们全部完成。问题是我在Task.WaitAllcopyingTasks.ToArray的代码块好像任务永远不会结束,所以它永远不会通过那行代码。下面是示例代码:

    private void CopyFilesFromWorkingCopyForProject(string projectName)
    {
        var copyingTasks = new List<Task>
            {
                CopyAllFromDirectoryToDirectory(FilesUtils.AndroidConfigsPath(), FilesUtils.AndroidPathForProject(projectName)),
                CopyAllFromDirectoryToDirectory(FilesUtils.AndroidValuesPath(), FilesUtils.AndroidPathForProject(projectName)),
                CopyFileToDirectory(FilesUtils.AndroidManifestPath(), FilesUtils.AndroidPathForProject(projectName)),
                CopyAllFromDirectoryToDirectory(FilesUtils.IosConfigsPath(), FilesUtils.IosPathForProject(projectName))

            };
        Task.WaitAll(copyingTasks.ToArray());
    }

    private async Task CopyAllFromDirectoryToDirectory(string sourceDirectory, string destinationDirectory)
    {
        foreach (string filename in Directory.EnumerateFiles(sourceDirectory))
        {
            await CopyFileToDirectory(filename, destinationDirectory);
        }
    }

    private async Task CopyFileToDirectory(string filename, string destinationDirectory)
    {
        using (FileStream sourceStream = File.Open(filename, FileMode.Open))
        {
            using (FileStream destinationStream = File.Create(destinationDirectory + filename.Substring(filename.LastIndexOf('\\'))))
            {
                await sourceStream.CopyToAsync(destinationStream);
            }
        }
    }
如果我对Task.WaitAllcopyingTasks.ToArray进行注释;它不再阻塞,但我想等待所有文件被复制。

,因为异步方法试图在当前被您的等待阻塞的上下文上恢复

相反,您应该做的是使CopyFilesFromWorkingCopyForProject也异步,并使调用该方法的方法和调用该方法的方法,…:

private async Task CopyFilesFromWorkingCopyForProject(string projectName)
{
    var copyingTasks = new List<Task>
        {
            CopyAllFromDirectoryToDirectory(FilesUtils.AndroidConfigsPath(), FilesUtils.AndroidPathForProject(projectName)),
            CopyAllFromDirectoryToDirectory(FilesUtils.AndroidValuesPath(), FilesUtils.AndroidPathForProject(projectName)),
            CopyFileToDirectory(FilesUtils.AndroidManifestPath(), FilesUtils.AndroidPathForProject(projectName)),
            CopyAllFromDirectoryToDirectory(FilesUtils.IosConfigsPath(), FilesUtils.IosPathForProject(projectName))

        };
    await Task.WhenAll(copyingTasks);
}
如果不能或不想这样做,则需要确保异步方法不会在当前上下文中恢复。为此,您可以对所有等待使用ConfigureWaitFalse,也可以使用Task.Run在后台线程上调用异步方法。

,因为异步方法尝试在当前被等待阻止的上下文上恢复

相反,您应该做的是使CopyFilesFromWorkingCopyForProject也异步,并使调用该方法的方法和调用该方法的方法,…:

private async Task CopyFilesFromWorkingCopyForProject(string projectName)
{
    var copyingTasks = new List<Task>
        {
            CopyAllFromDirectoryToDirectory(FilesUtils.AndroidConfigsPath(), FilesUtils.AndroidPathForProject(projectName)),
            CopyAllFromDirectoryToDirectory(FilesUtils.AndroidValuesPath(), FilesUtils.AndroidPathForProject(projectName)),
            CopyFileToDirectory(FilesUtils.AndroidManifestPath(), FilesUtils.AndroidPathForProject(projectName)),
            CopyAllFromDirectoryToDirectory(FilesUtils.IosConfigsPath(), FilesUtils.IosPathForProject(projectName))

        };
    await Task.WhenAll(copyingTasks);
}

如果不能或不想这样做,则需要确保异步方法不会在当前上下文中恢复。为此,您可以对所有等待使用ConfigureWaitFalse,也可以使用Task.Run在后台线程上调用异步方法。

是否进行了复制?我看不到任务是从哪里开始的。有没有拷贝?我不知道这些任务是从哪里开始的。