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



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

...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.

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

如何克服异常?

更新1:我已经尝试删除任务。等待全部并在不使用任务的情况下执行实现。尽管如此,我还是得到了线程中止错误,我认为 Task.Run(( 以某种方式超时了。

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

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

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

如果删除后仍然不起作用 Task.WaitAll((,我会读一读这个,因为它可能是真正的 如您所说超时或可能因其他原因异常: 为什么我在 asp.net 中收到"线程正在中止"?

最新更新