我正在尝试使用互斥锁实现单实例应用程序。 应用程序只能运行给定目录中的一个实例。 我试图在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 !!!
答案 0 :(得分:1)
如果你use:
Dim newInstance as boolean
myMutex = New Threading.Mutex(True, "Global\" + strLoc, newInstance)
您可以检查'newInstance'值,如果它创建了一个新值,那么就没有先前的实例,否则如果它没有创建一个新的那个,那么你的应用的另一个实例就可以了,所以你可以退出..
此外,您需要在应用程序的生命周期内保留互斥锁:您的互斥锁将仅保留在using语句的范围内,然后它将被释放。你必须把它存放在某个地方。