任务的执行与 C# 中的 Task.WaitAll 挂起

本文关键字:Task WaitAll 挂起 中的 执行 任务 | 更新日期: 2023-09-27 18:35:18

>我有一个像下面这样的类

public class ImageUploader
{
   ....
   public Task<string> Upload()
   {
      return new Task<string>(
                () =>
                    {
                        ....
                        return UploadedFilePath;
                    }
            );
   }
   ....
}

然后我像这样使用它

var uploadIcon = new ImageUploader();
var uploadLogo = new ImageUploader();
var uploadIconTask = uploadIcon.Upload();
var uploadLogoTask = uploadLogo.Upload();
Task.WaitAll(uploadIconTask, uploadLogoTask); // never returns

和任务等待所有永远挂起!

问题出在哪里?!

任务的执行与 C# 中的 Task.WaitAll 挂起

它挂起是因为您从未启动任务。所以WaitAll在等待他们完成,他们永远不会完成,因为他们从未开始过。

如果您查看 Task.WaitAll 的 doco,您将看到 StartNew() 用于创建的任务 - 这既创建又启动任务。

这应该有效:

public class ImageUploader
{
    ....
    public Task<string> Upload()
    {
        return Task.Run(() =>
        {
            ....
            return UploadedFilePath;
        });
    }
    ....
}