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

Tim*_*Tim 6 c# mutex compact-framework windows-mobile-6.5

我很难在没有命名的情况下弄清楚互斥锁的优点.具体来说,我想让我的Windows Mobile 6.5应用程序单实例.

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

不幸的是,紧凑框架中的互斥体的CTORS不需要字符串 - 只能创建一个互斥锁.

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

我错过了什么吗?

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

vcs*_*nes 14

在紧凑的框架本身,没有没有.

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

据说一个未命名的互斥锁是一个本地互斥锁.您仍然可以使用它在同一进程中的不同线程之间进行同步.像lock关键字这样的监视器没有相同的功能.正如ctacke所说,Mutex不允许递归入口.此外,不能跨AppDomain边界使用监视器.此外,Mutex可以与WaitHandle.WaitAll等有用的东西一起使用,或者WaitAny,监视器不能与任何这些东西一起使用.

我错过了什么吗?

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

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

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

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

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

你还必须写的P/Invoke要求ReleaseMutexCloseHandle.


具体来说,我想让我的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();
    
    Run Code Online (Sandbox Code Playgroud)