使用互斥锁进行单实例检查

时间:2011-10-26 04:06:14

标签: .net vb.net mutex

我正在尝试使用互斥锁实现单实例应用程序。 应用程序只能运行给定目录中的一个实例。 我试图在Applicationsevents类中实现它,但它不起作用。

我用一个单一形式的测试工具复制它。 我的ApplicationEvents.vb代码:

   Private Sub SingleInstanceCheck(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupEventArgs) Handles Me.Startup

        Dim strLoc As String = Assembly.GetExecutingAssembly().Location
        Dim fileInfo As IO.FileSystemInfo = New IO.FileInfo(strLoc)
        Dim sExeName As String = fileInfo.Name

        strLoc = strLoc.Replace("\", "//")

        Using mutex As New Threading.Mutex(False, "Global\" + strLoc)
            If Not mutex.WaitOne(0, False) Then
                File.WriteAllText("c:\log.txt", "instance already running")
                Environment.Exit(1)
            End If

            GC.Collect()


        End Using

    End Sub

它运行多个实例。

我无法改变的事情: 1.project设置勾选“启用应用程序框架” 2. ApplicationEvents.vb处理UnhandleException,这意味着我不能将模块作为启动。

请helpppp !!!

1 个答案:

答案 0 :(得分:1)

如果你use

Dim newInstance as boolean
myMutex = New Threading.Mutex(True, "Global\" + strLoc, newInstance)

您可以检查'newInstance'值,如果它创建了一个新值,那么就没有先前的实例,否则如果它没有创建一个新的那个,那么你的应用的另一个实例就可以了,所以你可以退出..

此外,您需要在应用程序的生命周期内保留互斥锁:您的互斥锁将仅保留在using语句的范围内,然后它将被释放。你必须把它存放在某个地方。