C#中的跨进程锁定

时间:2010-09-03 19:52:59

标签: c# multithreading locking

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

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

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

5 个答案:

答案 0 :(得分:17)

对于C#/ .Net中的跨进程锁定,您可以使用named system Mutex

答案 1 :(得分:3)

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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

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

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

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