我很难在没有命名的情况下搞清楚互斥锁的优点。具体来说,我想让我的Windows Mobile 6.5应用程序单实例。
本网站上有一些关于如何做到这一点的问题和答案 - 最好的问题和答案似乎都使用了命名的互斥体。
Unfortunately the CTORS for mutexes in compact framework do not take a string - 只能创建一个互斥锁。
现在,如果没有关联的ID,互斥量有什么用呢?
我错过了什么吗?
如果我无法为多个应用程序命名,如何使用互斥锁保护资源?
答案 0 :(得分:14)
在紧凑的框架中,没有。
如果您无法命名互斥锁,有什么用途?
一个未命名的互斥锁据说是本地互斥锁。您仍然可以使用它在同一进程中的不同线程之间进行同步。像lock
关键字这样的监视器没有相同的功能。正如ctacke所述,互斥锁不允许递归入口。此外,不能跨AppDomain边界使用监视器。此外,Mutex可以与WaitHandle.WaitAll或WaitAny
等有用的内容一起使用,其中监视器不能与任何这些内容一起使用。
我错过了什么吗?
否 - 在.NET CF Framework中,如果没有平台调用的帮助,则无法命名互斥锁。
如果我无法为多个应用程序命名,如何使用互斥锁保护资源?
你必须为它们命名 - 你可以这样做,你只需要求助于一些平台调用。基于Windows CE的系统暂时有supported个名为互斥锁。您可以编写一个自己动手的P / Invoke调用:
[DllImport("Coredll.dll")]
public static extern IntPtr CreateMutex(IntPtr lpMutexAttributes, bool initialOwner, string lpName);
并将其用作(例如)CreateMutex(IntPtr.Zero, false, "MutexName");
你还必须为ReleaseMutex
和CloseHandle
编写P / Invoke电话。
具体来说,我想将我的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();
答案 1 :(得分:2)
Monitor(其中lock
是语法糖)和Mutex之间的区别很微妙,特别是在您查看单个进程时。可以通过获取线程重新输入监视器。互斥体不能。因此,如果你有一个递归算法,说是异步调用某些东西(是的,这是一个人为的例子,但它应该足以看到这个想法),你可以防止多个重叠异步调用与Mutex,但不能与监视器。