【问题标题】:Mutexes with the same name同名互斥锁
【发布时间】:2011-06-24 17:00:52
【问题描述】:

我对 C# 编程比较陌生,几天前,我遇到了 mutex 一词。它的使用是为了避免运行同一应用程序的多个实例。我实际上是在看一本关于 WPF 的书(当然是使用 C#),所以没有对 C# 进行深入的解释(作者是为有足够 C# 知识的人写的)。
它以这种形式使用:

Mutex mutex;
// ...

// Check for existing instance
string mutexName = "MyCompanyName.MyAppName";
bool createdNew;
mutex = new Mutex(true, mutexName, out createdNew);

// If there is an existing instance, shut down this one
if(!createdNew) { Shutdown(); }

我对互斥体的解释是它是一种系统范围的类型。所有单实例应用程序都访问系统中的所有互斥锁以防止出现多个实例。还。互斥体应该有一个唯一的name。 (当然,我会得到纠正;这是我自己的解释,所以可能是错误的)。

假设恰好有一个名为 "mutexConflict" 的互斥锁由应用程序 A 创建,而另一个应用程序 B(由完全不同的作者创建)有自己的互斥锁,也名为 "mutexConflict"。如果 A 已经在运行并且 B 即将运行,难道不应该有冲突吗? B会跑吗?

【问题讨论】:

    标签: c# mutex


    【解决方案1】:

    如果出于这个原因,示例使用“MyCompanyName.MyAppName”,因为您公司中的其他团队不太可能正在开发与您同名的应用程序

    【讨论】:

    • 这就是书中的例子。尽管发生这种情况的可能性很小,但它可能会发生。
    【解决方案2】:

    这正是互斥锁的重点。您有一些密钥,并且您希望提供该密钥的互斥使用。

    【讨论】:

      【解决方案3】:

      是的,应该是冲突。这就是为什么您为可能是唯一的互斥锁选择这样的名称的原因。

      如果您希望一次只运行一个应用程序实例,您只需在程序开始时打开一个命名互斥体,如果存在,则将其关闭。这就是你的例子的重点,这就是它通常的实现方式。

      【讨论】:

      • 我暗示应用程序 B 可能是由另一位作者编写的,很可能我不知道该作者。如果我同时编写这两个应用程序并以类似方式命名 mutice(?),那我会很傻。
      • @afaolek:如果您想强制它们不同时运行,这将是有意义的。
      • @afaolek:尽管如此,您仍然可以编造一个即使您不认识他们也不会想到的名字。例如:“正视新闻播音员的鼻子,服务员,或者友好的牛奶会取消我的裤子。”
      猜你喜欢
      • 2018-05-23
      • 1970-01-01
      • 2011-06-10
      • 1970-01-01
      • 2010-09-16
      • 2014-05-02
      • 1970-01-01
      • 1970-01-01
      • 2010-12-17
      相关资源
      最近更新 更多