.Net System Wide Flag以确定应用程序/线程是否正在运行

时间:2010-02-08 13:54:14

标签: .net multithreading mutex

我正在开发一个托管远程对象的长时间运行的进程。由于设计限制,我无法使用Windows服务,因此该过程是后台Forms应用程序。我也不能使用WPF,因为我们仅限于.Net 2.0。在任何情况下,由于无法保证后台进程正在运行,我希望能够从我可以从另一个进程检查的进程中设置系统范围的标志。

我读了并尝试使用互斥锁,但似乎没有办法确定互斥锁是否存在而不创建它如果它已经不存在(除非我遗漏了某些东西,这总是可能的)

理想情况下,一个系统范围的变量,它的生命周期由长时间运行的应用程序决定,它不仅是理想的信号,无论是否正在运行,还可能存储原始状态数据(如简单的整数枚举)。 / p>

有人能提出一个很好的方法来实现这个目标吗?

3 个答案:

答案 0 :(得分:1)

是的,使用Mutex类。你需要Mutex(bool,string,out bool)构造函数,最后一个“createdNew”参数告诉你是否还没有创建互斥锁。如果您希望能够检测到任何版本的程序在任何会话中运行(包括服务和远程登录),请使用“global \”前缀互斥锁的名称。

答案 1 :(得分:0)

因此,在互斥锁上使用访问控制似乎就是答案。这是我做的:

长期运行的过程

        Dim MutextWasCreated As Boolean

        ' Create a security rule for the mutex so other threads cannot take ownership
        Dim MutexSec As New MutexSecurity
        Dim rule As New MutexAccessRule(Environment.UserDomainName & "\" & Environment.UserName, MutexRights.TakeOwnership, AccessControlType.Deny)

        MutexSec.AddAccessRule(rule)

        App_Mutex = New Mutex(True, "Global\MyMutexName}", MutextWasCreated, MutexSec)
        App_Mutex.WaitOne(-1, True)

然后,在客户端应用程序上,使用以下命令尝试打开互斥锁:

            Dim HostIsRunning As Boolean

        Try
            Mutex.OpenExisting("Global\MyMutexName", AccessControl.MutexRights.TakeOwnership)
        Catch ex As Exception
            If TypeOf ex Is UnauthorizedAccessException Then
                ' The mutex is created by the host to dissalow other threads from taking ownership. If we get this exception, we know the mutext has been created, thus the app is running.
                HostIsRunning = True
            ElseIf TypeOf ex Is WaitHandleCannotBeOpenedException Then
                HostIsRunning = False
            Else
                Throw ex
            End If
        End Try

答案 2 :(得分:0)

来自您的主要流程的

通过远程处理与

相同

MyProcessInfo:MarshalByRef {    bool IsRunning()    {       返回true;    } }

如果远程调用抛出异常“找不到服务MyProcessInfo.rem”(我不记得确切的单词)进程未激活,如果你想要,你可以返回与简单整数枚举相同的信息