我应该使用什么形式的任务控制来处理使用SignalR的MVC中的长时间运行的进程

本文关键字:SignalR MVC 运行 进程 处理 长时间 控制 什么 任务 我应该 | 更新日期: 2023-09-27 18:08:33

我的问题是关于在使用SignalR时处理MVC(5)内长时间运行任务的最佳方法。我的应用程序有一些长时间运行的任务,一些计算绑定和一些等待服务,我从MVC运行,然后使用SignalR来处理进度消息和取消。

我当前的实现是在async/await退出之前开始的,它在一个带有id的并发字典中注册类/方法。然后MVC返回一个Id给Ajax调用,然后退出视图。JavaScript发送一个带有Id的"开始"消息给SignalR,然后从字典中恢复类,然后调用长时间运行的方法,即阻塞Hub。

我这样做的理由是,说实话,这样做更容易,因为在ASP.NET中任务处理是一项艰巨的工作。这也意味着进度消息(包括相当详细的文本进度消息)可以使用现有的Hub实例。缺点是,我想,SignalR一直保持一个线程打开,这不是很好。

我现在根据async/await重新审视这个设计。我可以改变设计,让SignalR Hub等待一个任务,从而释放线程。这是最好的方法吗?我想我会在创建SignalR hub来发送我的消息时受到打击,所以总的来说,它可能需要更多的处理能力。但是,它可以更好地伸缩。

有没有人有这样的经验,因为它必须是MVC中SignalR的一个相当标准的使用。欢迎所有的想法/经验。

我应该使用什么形式的任务控制来处理使用SignalR的MVC中的长时间运行的进程

将cpu绑定的后台任务设置为异步是没有意义的,但是您可以对I/o绑定的后台任务这样做。

如果你使用async/await, hub仍然存在;我不明白为什么需要额外的集线器。SignalR理解async。

顺便说一句,你确实想要确保你的后台任务是可靠的,正如@usr所指出的。我上周写了一篇博文,总结了在ASP.NET上(半安全的)执行后台工作的各种方法。