2013-10-13 47 views
1

我有一个像下面执行的任务与Task.WaitAll挂在C#

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挂起永远一类!

是什么问题?

回答

8

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

如果您查看Task.WaitAll的doco,您会看到StartNew()用于已创建的任务 - 这既创建任务,又开始任务。

+0

对于'async' /'await'你应该使用'Task.Run'。 –

2

这应该工作:

public class ImageUploader 
{ 
    .... 

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

      return UploadedFilePath; 
     }); 
    } 
    .... 
} 
相关问题