我有一个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()会超时。
答案 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?