Task.WaitAll()在Task.Run()中终止

时间:2018-10-17 12:40:36

标签: c# asynchronous asp.net-web-api2

我有一个Web api 2控制器,客户端请求该控制器进行某种类型的html生成(包括图像,文件等)。由于该过程需要一些时间,而且我不希望用户等待,因此我在Controller中采用了以下方法:

...Controller(){
Task.Run(() =>
        {
          //calling heavy duty method to download files where Task.WaitAll() resides
          DownloadAndRename()
        });
}

DownloadAndRename(){
     //created some child task here and run them in task.waitall()
     //Task.WaitAll() here
}

我为每个文件创建了下载,重命名和其他过程的任务。然后在Task.WaitAll()中执行它们。

当我在本地运行该应用程序时,一切正常。但是,当我部署到测试服务器时,它抛出了以下异常:

Message: System.Threading.ThreadAbortException: Thread was being aborted.

P.S。在我的电脑中,我只有一个应用程序在应用程序池中运行,而在我的测试服务器中,该特定池中只有8个应用程序。

如何克服该异常?

更新1:我已尝试通过删除task.WaitAll来进行实现,而无需使用 Task 。尽管如此,我还是遇到了线程中止错误,我认为Task.Run()会超时。

1 个答案:

答案 0 :(得分:0)

我认为这个问题是对任务执行的简单误解。

如果您希望任务立即作为后台任务运行,则可以在Controller操作中添加async关键字和Task返回类型,并使DownloadAndRename()异步并使其返回Task,然后从控制器动作范围。调用线程将不会以这种方式被阻塞,并且在返回的任务完成之前,任务之后的任何代码都不会执行。

async Task Controller()
{
await DownloadAndRename();
}

如果删除后仍然无法使用     Task.WaitAll(),我会读到它,因为它可能确实是     如您所说超时,或者可能由于其他原因而异常:     Why am i getting "Thread was being aborted" in asp.net?