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

时间:2013-10-13 06:34:35

标签: c# asp.net asynchronous .net-4.5

我有一个类似下面的课程

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

和Task.WaitAll永远挂起!

有什么问题?!

2 个答案:

答案 0 :(得分:8)

它因为你从未开始任务而挂起。因此WaitAll等待他们完成,因为他们从未开始过,所以他们永远不会这样做。

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

答案 1 :(得分:2)

这应该有效:

public class ImageUploader
{
    ....

    public Task<string> Upload()
    {
        return Task.Run(() =>
        {
            ....

            return UploadedFilePath;
        });
    }
    ....
}