我很难在不命名互斥锁的情况下弄清楚它有什么好处。具体来说,我想让我的 Windows Mobile 6.5 应用程序成为单实例。
这个网站上有一些关于如何做到这一点的问题和答案 - 最好的问题和答案似乎使用命名互斥锁。
不幸的是,紧凑框架中互斥锁的 CTORS 不采用字符串- 只能创建一个互斥锁。
现在,如果互斥体没有关联的 ID,那么它有什么用呢?
我错过了什么吗?
如果我不能命名它们,如何使用互斥锁来保护多个应用程序中的资源?
我很难在不命名互斥锁的情况下弄清楚它有什么好处。具体来说,我想让我的 Windows Mobile 6.5 应用程序成为单实例。
这个网站上有一些关于如何做到这一点的问题和答案 - 最好的问题和答案似乎使用命名互斥锁。
不幸的是,紧凑框架中互斥锁的 CTORS 不采用字符串- 只能创建一个互斥锁。
现在,如果互斥体没有关联的 ID,那么它有什么用呢?
我错过了什么吗?
如果我不能命名它们,如何使用互斥锁来保护多个应用程序中的资源?
在紧凑的框架本身中,没有。
如果你不能命名互斥锁,它有什么用?
未命名的互斥锁被称为本地互斥锁。您仍然可以使用它在同一进程中的不同线程之间进行同步。像lock
关键字这样的监视器没有相同数量的功能。正如ctacke 所指出的,互斥锁不允许递归进入。此外,监视器不能跨 AppDomain 边界使用。此外,Mutex 可以与有用的东西一起使用,例如WaitHandle.WaitAll或WaitAny
,其中监视器不能与任何这些东西一起使用。
我错过了什么吗?
否 - 在 .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 应用程序成为单实例。
命名互斥锁是一种解决方案。另一个可能对您有用的解决方案是使用文件锁。
FileShare.None
。当程序关闭时,清理锁。即使进程崩溃或异常终止,文件上的锁定也应该被删除,允许另一个实例启动。像这样的东西:
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();
Monitor(它是语法糖)和 Mutex 之间的区别lock
是微妙的,尤其是当您查看单个进程时。获取线程可以重新进入监视器。互斥锁不能。因此,如果您有一个递归算法说异步调用某些东西(是的,这是一个人为的示例,但应该足以看到这个想法),您可以使用 Mutex 来防止多个重叠的异步调用,但不能使用 Monitor。