gpt4 book ai didi

c# - Asp.Net MVC 5 - 长时间运行的任务 - 如何确保 IIS 回收 AppPool 时工作线程不会被丢弃?

转载 作者:太空宇宙 更新时间:2023-11-03 19:49:59 25 4
gpt4 key购买 nike

我有一个数据处理 MVC 应用程序,它处理大小从 100MB 到 2GB 不等的上传文件,并且包含几个长时间运行的操作。用户将上传文件,这些文件中的数据将被处理,最后将对数据的一些分析发送给相关用户/客户。

处理数据至少需要几个小时,因此为了确保用户不必一直等待,我启动了一个单独的任务来执行这个长时间运行的操作。这样,一旦文件被服务器接收并存储在磁盘上,用户将收到带有 ReferenceID 的响应,并且他们可以关闭浏览器。

到目前为止,它一直按预期运行良好,但在阅读了有关在 MVC 中使用即发即弃模式以及工作线程在回收期间被 IIS 丢弃的问题后,我对这种方法感到担忧。

这种方法还安全吗?如果没有,我如何确保正在处理数据的线程在完成处理并将数据发送给客户端之前不会死亡? (以一种相对简单的方式)

该应用程序在 .NET 4.5 上运行,所以不要认为我现在可以使用 HostingEnvironment.QueueBackgroundWorkItem

在 Controller 上使用 Async/Await 有帮助吗?

我还考虑过在文件存储到磁盘后使用应用服务器上的消息队列来存储消息,然后将 DataProcessor 设为单独的服务/进程,然后收听队列。如果队列是可恢复的,那么它将向我保证,即使服务器崩溃或线程在完成数据处理之前被丢弃,消息最终也会得到处理。这是更好的方法吗?

我当前的设置如下所示

Controller

public ActionResult ProcessFiles() 
{
HttpFileCollectionBase uploadedfiles = Request.Files;

var isValid = ValidateService.ValidateFiles(uploadedFiles);

if(!isValid){
return View("Error");
}

var referenceId = DataProcessor.ProcessData(uploadedFiles);

return View(referenceId);
}

业务逻辑

public Class DataProcessor 
{
public int ProcessFiles(HttpFileCollectionBase uploadedFiles)
{
var referenceId = GetUniqueReferenceIdForCurrentSession();

var location = SaveIncomingFilesToDisk(referenceId, uploadedFiles);

//ProcessData makes a DB call and takes a few hours to complete.

TaskFactory.StartNew(() => ProcessData(ReferenceId,location))
.ContinueWith((prevTask) =>
{
Log.Info("Completed Processing. Carrying on with other work");

//Below method takes about 30 mins to an hour
SendDataToRelatedClients(ReferenceId);
}
return referenceId;
}

}

引用资料

http://blog.stephencleary.com/2014/06/fire-and-forget-on-asp-net.html

Apppool recycle and Asp.net with threads?

最佳答案

Is this approach still safe?

从来都不安全。

Does using Async/Await at controller help?

没有。

The app runs on .NET 4.5, so don't think I will be able to use HostingEnvironment.QueueBackgroundWorkItem at the moment.

我有一个 AspNetBackgroundTasks library这基本上与 QueueBackgroundWorkItem 做同样的事情(有细微差别)。然而……

I've also thought of using a message queue on app server to store messages once the files are stored to disk and then making the DataProcessor a separate service/Process and then listen to the queue. If the queue is recoverable, then it will assure me that the messages will always get processed eventually even if the server crashes or the thread gets thrown away before finish processing the data. Is this a better approach?

是的。这是唯一可靠的方法。这就是我在 my blog post 中所说的“适当的分布式架构” .

关于c# - Asp.Net MVC 5 - 长时间运行的任务 - 如何确保 IIS 回收 AppPool 时工作线程不会被丢弃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40639255/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com