c# - 一次将控制器操作请求限制为一个
问题描述
我的 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# 中的队列类。我建议不要为每个请求生成一个新线程,而是使用单个线程来监视队列并调用 FileGenerator 方法来创建文件。在这种情况下,您也不需要使其异步。
因此,每当用户访问控制器方法时,它都会将模型放入队列中。只要其中有一些模型,监控队列的线程就会处理它。
这可能是队列管理的一种粗略方式:)
更好的方法是使用标准的队列机制 MSMQ,但这又取决于应用程序的复杂性和所需的可伸缩性。
推荐阅读
- c - 找不到 pthread Eclipse GCC 链接器问题
- google-sheets - 复选框限制最大数量。根据 Google 表格中的单元格值进行选择
- ios - SwiftUI 中另一个按钮内的按钮
- javascript - 如何在 Javascript 或 JQuery 中的元素之后获取字符?
- c# - how to convert ado.net to lambda
- javascript - Three.js FBX Load Background Transparency Not Working
- r - 根据条件使用来自两个变量之一的值来改变新变量
- ios - SwiftUI - 使用文件选择器打开属于另一个 IOS 应用程序的文件,然后直接访问该文件
- azure-ad-b2c - Is there any way to keep track of a counter for a button click in AD B2C custom policy
- python-3.x - 给定数字的可能排列