连名字都不会的互斥锁有什么用?我很难在不命名互斥锁的情况下弄清楚互斥锁的优点。具体来说,我想让我的WindowsMobile6.5应用程序成为单实例。这个网站上有一些关于如何做到这一点的问题和答案——最好的似乎是使用命名互斥锁。不幸的是,紧凑框架中互斥体的CTORS不需要字符串——只能创建互斥体。现在,如果没有关联的ID,互斥有什么用呢?我错过了什么吗?如果无法命名,如何使用互斥量来保护多个应用程序中的资源?在紧凑的框架本身,没有。如果不能命名,互斥体有什么用?未命名的互斥量被称为本机互斥量。您仍然可以使用它在同一进程中的不同线程之间进行同步。像lock关键字这样的监视器不具有相同的功能。正如ctacke所说,Mutex不允许递归进入。此外,监视器不能跨AppDomain边界使用。此外,Mutex可以与WaitHandle.WaitAll或WaitAny等有用的东西一起使用,其中监视器不能与这些东西一起使用。我错过了什么吗?否-在.NETCFFramework中,如果没有平台调用的帮助,则无法命名互斥体。如果无法命名,如何使用互斥量来保护多个应用程序中的资源?你必须给它们命名——你可以这样做,你只需要求助于一些平台调用。基于WindowsCE的系统支持命名互斥锁已有一段时间了。您可以编写自己的P/Invoke调用实现:[DllImport("Coredll.dll")]publicstaticexternIntPtrCreateMutex(IntPtrlpMutexAttributes,boolinitialOwner,stringlpName);并将其用作(例如)CreateMutex(IntPtr.Zero,false,"MutexName");您还必须为ReleaseMutex和CloseHandle编写P/Invoke调用。具体来说,我想让我的WindowsMobile6.5应用程序成为单实例。命名互斥锁是一种解决方案。另一个可能适合您的解决方案是使用文件锁。如果名为foo.txt的文件不存在,则会在启动时创建该文件。使用FileShare.None获取文件file上的写锁。由于第一个实例锁定了它并且不会共享它,因此不同的实例将无法获取它的写锁。捕获异常并终止程序,因为程序已经在运行。当程序关闭时,锁被清除。即使进程崩溃或异常终止,也应该删除文件上的锁,以便可以启动另一个实例。像这样的东西:FileStream流;try{stream=newFileStream("lock.txt",FileMode.OpenOrCreate,FileAccess.ReadWrite,FileShare.None);}catch{MessageBox.Show("程序已经运行。");返回;}//把你的应用程序代码放在这里。MessageBox.Show("程序正在运行。");stream.Close();监视器(锁是语法糖)和互斥锁之间的区别很微妙,尤其是当您查看单个进程时。可以通过获取线程重新进入监听。互斥体不能。因此,如果你有一个递归算法,比如说,异步调用某些东西(是的,这是一个人为的例子,但它应该足以看出这个想法),你可以使用互斥锁来防止多次重叠的异步调用,但不能使用监视器.C#学习教程就是这些:如果不能命名,互斥锁有什么用?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
