C# 在MVC.NET上并发访问数据

C# 在MVC.NET上并发访问数据,c#,asp.net-mvc,concurrency,C#,Asp.net Mvc,Concurrency,我有一个MVC网站,可以访问数据库中的进程列表,并选择一个“随机”进程,以便用户进行分析。他可以批准或不批准该流程,并自动接收另一个流程 问题是几个用户将同时执行该过程,我需要阻止那些已经在审查中的过程 我不能在数据库方面这样做,所以必须是一个应用程序解决方案,并且对用户完全不可见 我怎样才能解决这个问题 ---编辑 一种情况是:用户获得一个进程(进程被锁定),然后“忘记”打开或“关闭”浏览器。 所以我需要以某种方式解开这个过程 我有一些想法: 使用MSMQ(当用户“忘记”完成任务时,是否可以

我有一个MVC网站,可以访问数据库中的进程列表,并选择一个“随机”进程,以便用户进行分析。他可以批准或不批准该流程,并自动接收另一个流程

问题是几个用户将同时执行该过程,我需要阻止那些已经在审查中的过程

我不能在数据库方面这样做,所以必须是一个应用程序解决方案,并且对用户完全不可见

我怎样才能解决这个问题

---编辑

一种情况是:用户获得一个进程(进程被锁定),然后“忘记”打开或“关闭”浏览器。 所以我需要以某种方式解开这个过程

我有一些想法:

  • 使用MSMQ(当用户“忘记”完成任务时,是否可以将进程放回原处?)

  • 在我的webapp上使用静态ConcurrentBag来查看ID列表。(IIS回收会杀死该列表吗?)


谢谢

为什么不使用System.Web.HttpContext.Current.Application

您可以创建一个自定义类,该类保留进程的ID并管理访问


希望这能有所帮助。

如果数据库表不是一个选项,您可以创建一个内存缓存,在其中存储正在查看的Id。每次有人开始查看时,检查内存缓存以查看要查看的Id是否存在。如果不存在,则将新id添加到内存缓存中。(您可以在内存缓存中存储id列表)

您可以使用该类来实现这一点


记住,这是在记忆中。因此,应用程序池重置可以清除内存。此外,当您将来有多台服务器时,这可能不起作用(跨服务器共享缓存时出现问题!)。在这种情况下,您需要一个集中的位置来保存这些信息。我的建议是在sql server中使用db表。

您可以考虑使用ConcurrentBag。您可以使用另一个包含“待审核”的表,并在选择流程时将ID添加到该表中。当选择进程时,如果ID在该表中,那么它已经被检查了,您需要选择另一个。Ron,正如我在问题上所说的,我不能在数据库端这样做…在多少服务器上,该应用程序同时运行?首先,只在一台服务器(iis)上运行,谢谢,控制被放弃进程的最佳方法是什么?用户可以关闭浏览器或忘记打开。。。