【问题标题】:Single instance check using mutex使用互斥锁进行单实例检查
【发布时间】:2011-10-26 04:06:13
【问题描述】:

我正在尝试使用互斥锁实现单实例应用程序。 应用程序只能从给定目录运行一个实例。 我试图在 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.项目设置有“启用应用程序框架”打勾 2. ApplicationEvents.vb 处理 UnhandleException 这意味着我不能有一个模块作为启动。

请帮帮忙!!!

【问题讨论】:

  • 虽然与您的问题没有直接关系,但您应该非常小心手动调用 GC.Collect,它几乎总是会导致垃圾收集器的性能比其他情况下更差。

标签: .net vb.net mutex


【解决方案1】:

如果你use:

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

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

您还需要在应用程序的整个生命周期中保留互斥锁:您的互斥锁只会在您的 using 语句的范围内保留,然后它会被释放。您必须将其存储在某个地方。

【讨论】:

  • 感谢您的回复。我尝试了在我的测试应用程序中提出的建议,该应用程序只有一个表单,并且有效。但如果我在现实世界的 Windows 应用程序中做同样的事情,它就不起作用。这让我更加困惑,我认为必须有一些特定于解决方案或项目的设置。
  • 它不应该是任何与解决方案或项目设置相关的东西,重要的是保持互斥体,使其成为成员变量,并且不要将其包装在'Using'中
  • 在这种情况下,肯定是其他东西杀死了互斥锁。根据 msdn “应用程序在主应用程序运行之前引发 Startup 事件。”。除了检查互斥锁的代码外,我在该子目录中没有任何内容。它在测试表上运行良好。我的应用程序使用 wcf、线程、计时器等。所以部分代码正在处理互斥锁
  • 如果您的子程序中有 'Using' 语句,它会在到达 'End Using' 时处理互斥锁...您可以发布更多代码吗?
  • 终于让它工作了,我尝试了你的建议并将互斥锁作为成员变量:Private mutex As Mutex。但它没有解释为什么它适用于具有局部变量的测试应用程序。感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-25
  • 1970-01-01
  • 2011-07-16
  • 2016-05-01
  • 1970-01-01
  • 2014-09-26
  • 1970-01-01
相关资源
最近更新 更多