与此问题相关,命名互斥锁的最佳做法是什么?我意识到这可能会因操作系统甚至版本(尤其是Windows)而有所不同,所以请在回答时指定平台.我的兴趣在于Win XP和Vista.
全局互斥锁的一个非常安全的名称是<a description> + <a GUID>
:
MyApp Single Instance Mutex : {c96f7db4-d743-4718-bef0-8533a198bcca}
Run Code Online (Sandbox Code Playgroud)
通过使用这样的名称,其他人绝对不可能使用与互斥锁相同的互斥锁名称.
使用进程资源管理器嗅探,您可以看到GUID在一些地方使用,但通常不使用它们.确实出现的一种模式是"mutex"这个词被大量使用,微软似乎喜欢使用capitols.
建议:
将对象类型(在本例中为互斥体)和应用程序命名空间合并到唯一名称中。这通常是安全的。如果你想真正安全,那么还可以附加一个 Guid。
例子:
string mutexName = "MUTEX: Skyz.Messaging.ThreadPooling.MyAppSingleInstance";
Run Code Online (Sandbox Code Playgroud)
优点:
通过为应用程序创建命名约定,您可以轻松管理许多对象名称,创建更易读的代码,并使现有和未来的开发人员更容易理解代码。
提示:
不要直接在代码中使用互斥体,而是编写一个可重用的包装类,这样可以使代码更易于维护,以防您想要更改实现或添加调整。请记住使用一次性模式删除互斥体,否则您会遇到问题!
using (SingletonProcess singletonProcess = new SingletonProcess("MUTEX: Skyz.Apps.MessagingQueue.InstanceMarker"))
{
if (singletonProcess.IsDuplicateInstance)
{
ConsoleWriter.WriteColorLine("An instance of the ExporterService exists, you cannot start a second instance.");
return
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
10356 次 |
最近记录: |