naw*_*fal 9 c# mutex multiple-instances winforms c#-2.0
通常我会看到这两段代码.两者都适用于我的情况,但我应该坚持哪些?
情况1:
bool isNew = false;
Mutex mutex = new Mutex(true, "MyApp_Mutex", out isNew);
if (!isNew)
{
    MessageBox.Show("already running.", "Multiple Instances Not Allowed",
                                        MessageBoxButtons.OK, 
                                        MessageBoxIcon.Exclamation);
    return;
}
案例2:
Mutex mutex = new Mutex(false, "MyApp_Mutex"))            
if (!mutex.WaitOne(0, false))
{
    MessageBox.Show("already running.", "Multiple Instances Not Allowed", 
                                        MessageBoxButtons.OK, 
                                        MessageBoxIcon.Exclamation);
    return;
}
哪两个是防止多个实例之间的理想方式?
有什么不同?
此外,我看到这样的代码:
//if not return{
mutex.ReleaseMutex(); 
GC.Collect(); 
//application.Run();
GC.KeepAlive(mutex); 
在第二种方法下,但从来没有第一种方法.为什么会这样?或者我弄错了?
基本上,它取决于对所用参数和方法的正确理解.如果有人可以简要介绍一下,我会很感激,在阅读msdn文档时我不明白.
在第一种情况下,您要求操作系统创建互斥锁,并在创建时为您提供所有权 - 这是通过第一个参数完成的initiallyOwned.该isNew参数告诉您它是否是新的互斥锁.如果它是新的,那么你保证拥有它的所有权,因为这是你用initiallyOwned参数要求的.因为它是新的,并且你拥有它,你知道没有其他的应用程序运行实例,因为如果有的话,他们已经创建了互斥锁并且他们将拥有它.
第二种情况基本上是相同的,但以稍微不同的方式完成.它不是在创建时请求所有权,而是在WaitOne通话中.WaitOne请求所有权,并等待0毫秒.如果您获得所有权,那么您就知道没有其他应用程序实例正在运行,原因与案例1相同.
至于使用哪个,据我所知,这无关紧要.第一个似乎更直观,至少对我而言.
添加新问题#3的答案
当应用程序完成时,它应该释放互斥锁,因为它拥有它.当你的应用程序退出时,.NET可能会为你发布它,但这样做是很好的做法.GC.Collect并GC.KeepAlive正在处理垃圾收集.在处理控制启动的互斥锁时,我无法想到为什么需要这些调用.我将我的互斥锁声明为静态,因此它将始终在范围内,并且在我的应用程序的生命周期内不会被垃圾收集器释放.
| 归档时间: | 
 | 
| 查看次数: | 1848 次 | 
| 最近记录: |