6

我很难在不命名互斥锁的情况下弄清楚它有什么好处。具体来说,我想让我的 Windows Mobile 6.5 应用程序成为单实例。

这个网站上有一些关于如何做到这一点的问题和答案 - 最好的问题和答案似乎使用命名互斥锁。

不幸的是,紧凑框架中互斥锁的 CTORS 不采用字符串- 只能创建一个互斥锁。

现在,如果互斥体没有关联的 ID,那么它有什么用呢?

我错过了什么吗?

如果我不能命名它们,如何使用互斥锁来保护多个应用程序中的资源?

4

2 回答 2

14

在紧凑的框架本身中,没有。

如果你不能命名互斥锁,它有什么用?

未命名的互斥锁被称为本地互斥锁。您仍然可以使用它在同一进程中的不同线程之间进行同步。像lock关键字这样的监视器没有相同数量的功能。正如ctacke 所指出的,互斥锁不允许递归进入。此外,监视器不能跨 AppDomain 边界使用。此外,Mutex 可以与有用的东西一起使用,例如WaitHandle.WaitAllWaitAny,其中监视器不能与任何这些东西一起使用。

我错过了什么吗?

否 - 在 .NET CF 框架中,如果没有平台调用的帮助,您无法命名互斥锁。

如果我不能命名它们,如何使用互斥锁来保护多个应用程序中的资源?

你必须给它们命名——你可以这样做,你只需要求助于一些平台调用。基于 Windows CE 的系统已经支持命名互斥锁有一段时间了。您可以编写一个自己执行的 P/Invoke 调用:

[DllImport("Coredll.dll")]
public static extern IntPtr CreateMutex(IntPtr lpMutexAttributes, bool initialOwner, string lpName);

并将其用作(例如)CreateMutex(IntPtr.Zero, false, "MutexName");

您还必须为ReleaseMutex和编写 P/Invoke 调用CloseHandle


具体来说,我想让我的 Windows Mobile 6.5 应用程序成为单实例。

命名互斥锁是一种解决方案。另一个可能对您有用的解决方案是使用文件锁。

  1. 如果不存在,则在启动时创建一个名为 foo.txt 的文件。
  2. 使用 获取文件文件的写锁定FileShare.None
  3. 不同的实例将无法在其上获取写锁,因为第一个实例对其具有锁并且不会共享它。捕获异常并终止程序,因为程序已经在运行。
  4. 当程序关闭时,清理锁。即使进程崩溃或异常终止,文件上的锁定也应该被删除,允许另一个实例启动。像这样的东西:

    FileStream stream;
    try
    {
         stream = new FileStream("lock.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None);
    }
    catch
    {
        MessageBox.Show("Program is already running.");
        return;
    }
    //Put your application code here.
    MessageBox.Show("Program is now running.");
    stream.Close();
    
于 2011-10-06T19:37:28.717 回答
2

Monitor(它是语法糖)和 Mutex 之间的区别lock是微妙的,尤其是当您查看单个进程时。获取线程可以重新进入监视器。互斥锁不能。因此,如果您有一个递归算法说异步调用某些东西(是的,这是一个人为的示例,但应该足以看到这个想法),您可以使用 Mutex 来防止多个重叠的异步调用,但不能使用 Monitor。

于 2011-10-07T15:56:59.637 回答