在Windows服务中保持C#Mutex活着

时间:2011-08-09 11:35:56

标签: c# .net multithreading windows-services mutex

我编写了一个C#Windows服务应用程序,每20分钟左右通过一个计时器委托读取一个文件,反序列化内容,然后清除文件。该文件由在同一台机器上运行的一个或多个客户端应用程序写入,我选择使用Mutex或多或少地“锁定”文件,同时将其反序列化并由服务写入。

我这样做是为了避免客户端应用程序和服务在极少数情况下同时尝试写入文件时出现异常。

我通过以下C#代码在Windows服务中创建Mutex(每20分钟运行一次):

public void MyServiceFunction() {
        Mutex sessMutex = new Mutex(false, "sessMutex");
        sessMutex.WaitOne();
        // Write to the file ...... 
        sessMutex.ReleaseMutex();
}

在客户端应用程序中,我运行以下命令:

public void MyClientFunction() {
    Mutex mutex = Mutex.OpenExisting("sessMutex");
    mutex.WaitOne();
    // Write to the file ...... 
    mutex.ReleaseMutex();
}

现在,如果我启动Windows服务并在几分钟内运行客户端应用程序,一切正常。但是,在尝试执行客户端应用程序几个小时后,我收到以下错误:

No handle of the given name exists.

我的问题是,如何防止此错误发生并“保持”互斥锁。

将Mutex存储为Windows服务类的属性是否有效?使用Mutex是实现我正在寻找的功能的正确方法吗?

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

我不明白为什么你在客户端对待互斥锁的方式不同 它应该是两个程序中的相同代码:

Mutex sessMutex = new Mutex(false, "sessMutex");
sessMutex.WaitOne();
// Write to the file ...... 
sessMutex.ReleaseMutex();
  1. 创建互斥锁 - 如果系统中已存在互斥锁,则会返回现有的互斥锁!
  2. 尝试锁定
  3. 写入文件
  4. 释放锁定

答案 1 :(得分:0)

显然,服务会创建互斥锁,锁定它并启动文件操作,然后释放它,然后只要该方法失去范围,它就有资格进行垃圾收集。随后,在客户端中,您似乎假设互斥锁仍然存在...是将其存储在服务范围内可能有效,但是如果服务因任何原因退出,则客户端仍然可以抛出该异常。您的客户需要检查互斥锁是否仍在那里。 ps:如果不是,你的服务可能也不是..