繁体   English   中英

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

[英]Keeping a C# Mutex Alive in a Windows Service

我编写了一个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正确的方法来实现我正在寻找的功能?

在此先感谢您的帮助!

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM