首页 > 解决方案 > 一次将控制器操作请求限制为一个

问题描述

我的 FileController 中有以下方法:

[HttpPost]
[NoAsyncTimeout]
public ActionResult FileGenerator(FileViewModel model) {
...
_fileGenerator.CreateFile(model.Id,model.location);
...
}

CreateFile 方法定义如下:

public void CreateFile(int residentId, string location){ 
 ...
 var caller = new AsyncMethodCaller(GenerateFilesAsync);
 caller.BeginInvoke(residentId,location, new 
 AsyncCallback(GenerateFilesCallBack));
 ...
}

据我所知,AsyncMethodCaller 和 BeginInvoke 是将文件创建处理到不同的线程中,这样它就不会阻塞接口。上面的方法被一个 Web 应用程序调用,并且多个用户可以向控制器 Action FileGenerator 发出请求 - 这将同时处理文件生成(可能在多个线程中)。

我想实现一种机制来基于 FIFO 处理请求 - 即,如果用户访问 Web 应用程序并调用函数 FileGenerator,而正在生成此文件 - 来自不同 PC 的另一个用户同时调用该函数,他的请求应该在第一个用户文件生成后排队并执行。

MVC 中是否有任何机制或方法可以对来自用户的控制器操作请求进行排队?

标签: c#multithreadingcontroller

解决方案


您可以利用 C# 中的队列类。我建议不要为每个请求生成一个新线程,而是使用单个线程来监视队列并调用 FileGenerator 方法来创建文件。在这种情况下,您也不需要使其异步。

因此,每当用户访问控制器方法时,它都会将模型放入队列中。只要其中有一些模型,监控队列的线程就会处理它。

这可能是队列管理的一种粗略方式:)

更好的方法是使用标准的队列机制 MSMQ,但这又取决于应用程序的复杂性和所需的可伸缩性。


推荐阅读