.net - 转移.NET互斥锁的所有权

标签 .net windows-services ipc mutex signals

我读过有关mutex的信息,这些信息由线程拥有,并且只能由拥有的线程使用。在this answer中,该解决方案建议每个进程在发出互斥信号之前,必须拥有互斥锁的所有权。我必须在这里承认自己的愚蠢,不知道如何在IPC中使用事件,因为在我阅读MSDN时没有弹出事件,我喜欢唯一命名的mutex作为解决方案,但我什至不知道如何在WindowsService和常规过程之间转移所有权。请帮忙。

我可以补充一下吗,乔恩·斯凯特(Jon Skeet)的教程here告诉我,要在不同用户之间进行通信(就像我想的LocalSystem一样),需要在mutex名称前加上“Global \”前缀。我在.NET文档中找不到任何提及,我想他是对的,而且我必须比MSDN系统更重视MSDN系统。

最佳答案

要获得已经存在的Mutex的所有权,可以将静态方法Mutex.OpenExisting()与MutexRights = TakeOwnership一起使用

public static Mutex OpenExisting(
                                string name,    
                                MutexRights rights)
  • 权限参数必须包含MutexRights.Synchronize标志以允许线程等待互斥体,并包含MutexRights.Modify标志以允许它们调用ReleaseMutex()方法。
  • OpenExisting方法尝试打开现有的已命名互斥锁。如果系统互斥锁不存在,则此方法将引发异常,而不是创建系统对象。

  • 考虑到OpenExisting()可能引发UnauthorizedAccessException异常,我建议使用以下构造函数创建一个新的Mutex:
    public Mutex(
        bool initiallyOwned,
        string name,
        out bool createdNew
    )
    

    然后通过分析createdNew变量的值,您可以检查是否已经存在mutext或已创建新的mutext。

    关于.net - 转移.NET互斥锁的所有权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7798166/

    相关文章:

    .net - Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll的副本之间的差异

    c# - 创建服务还是后台应用程序?

    c# - 如何在内插字符串中使用三元运算符?

    c# - 学习Windows生态系统的最佳方法是什么?

    c# - 横向扩展 Windows 服务

    c# - 启动 Windows 服务时无法找到程序集文件 'example.dll'

    c# - 在 .NET 中读取文件内容更改

    c - 共享内存段的键为0

    electron - 如何区分一个ipc主节点(同一 channel )中的两个ipc渲染器

    c# - .Net 2.0 中的 TextBox AutoCompleteMode 属性