C#中的跨进程锁定

我编写了一个API,将在(1)Windows服务,(2)Web应用程序和(3)Windows窗体应用程序的同一个框中使用。 他们都需要共享一小组常用数据(一些int,一个日期和一个字符串,我可以将其作为单个类的属性)。

我可以使用哪种锁定机制进行跨进程,以便三个进程可以安全地共享资源而不会遇到冲突?

请不要数据库,寻找不需要额外依赖性的解决方案。 优选地,解决方案将以某种方式使用共享存储器或文件系统。

对于C#/ .Net中的跨进程锁定,您可以使用命名系统Mutex 。

使用EventWaitHandle对象构造每个进程可以锁定或阻止的命名事件。 适用于.NET 2.0及更高版本。

如果您的所有应用程序都驻留在一台计算机上,那么您可以使用进程间同步原语(如命名互斥锁和共享内存)。

但我认为更好的方法是使用类似WCF服务(可以驻留在Windows服务中)并通过指定的合同公开所有必要的信息。 在这种情况下,所有这个应用程序可以驻留在不同的机器上,但无论如何这个解决方案更加干净和健

您可以使用MSMQ在应用程序之间提供共享队列,其中一个应用程序充当主应用程序; 如果它始终运行,Windows服务将是最佳选择。

我使用System.Data.Sqlite在Windows服务和应用程序之间进行通信。 即使你没有说过数据库,你也许会发现这是一个值得妥协的方法。 它是一个没有管理员负担的嵌入式数据库。 您可以通过在应用程序中包含单个DLL来“运送”它,并将数据保存在单个文件中。

可以将其视为通过ADO.Net使用SQL语句访问的持久性文件; 它甚至可以运行LINQ界面。 您通过标准事务锁定(使用回滚)并且还提供加密。 您可以使用Visual Studio Service Explorer修改和查看其内容。 它适用于.Net 3.5和.Net 4.它是开源的,没有任何限制。 您可以在不破坏现有function的情况下添加列和表。 由于部署就像向解决方案中添加DLL一样简单,因此部署和支持更加容易。 并且由于连接字符串指向文件,因此可以轻松地从远程计算机中访问它。 也许不像共享队列或互斥体那样优雅,但它对我来说非常简单。

根据您的问题,这听起来像您需要跨进程通信。 因此,其中一个进程托管共享数据,其他进程需要访问该数据。

如果上述操作正确,您可以使用简单的进程锁定(如Monitor)来保护共享数据并公开WCF端点以提供对另一个进程的数据的访问。 使用命名管道传输进行WCf通信,对于同一个盒子上的进程之间的通信非常有效。

除非你使用像内存映射文件这样的共享资源来共享数据,否则不需要跨进程锁定,但说实话这很麻烦,需要你手动处理WCF会处理的很多东西。如果您需要,最终可以将单个盒子扩展到多个盒子。