如何处理vb.net应用程序的意外关闭

时间:2014-09-11 10:22:31

标签: vb.net

我正在开发VB.Net应用程序,我想阻止用户打开另一个程序会话,而他们已经有一个

所以我在我的数据库中创建了一个值,从离线变为在线并根据日志状态反转

Program Started = Online (In Form Load Event)
Program Closed = Offline (In Form Closing Event)

问题是:有时程序挂起或窗口等等,所以程序不会将该用户的DB值从Online更改为Offline,这会阻止他打开应用程序

那么我如何处理意外关闭我的程序以处理这种情况?

5 个答案:

答案 0 :(得分:2)

我认为你在这里讨论的是用户会话管理。如果我理解正确,您希望阻止任何一个用户同时登录到两个实例,而不是一次打开两个应用程序副本(显然每个用户都登录了不同的用户)。如果是这种情况,那么实施非常基本的东西实际上并不困难。

当您的用户登录时,请检查他们的会话表中是否已有记录。如果没有,则创建一个并使用会话ID发出该用户。然后必须在所有操作期间提供此ID,以便您可以检查它是否有效。到目前为止,非常好。

如果该会话表中已有记录,则使其无效(删除它,更改状态 - 无论如何),以便不能使用旧会话ID并发出新会话ID。这样,如果您的用户已经打开了应用程序的登录副本然后启动另一个,第一个将不再实际做任何有用的事情(不要忘记告知用户无效的会话ID是他们可以'的原因'做任何事情。)

显然,你需要在应用程序的生命周期中保留该会话ID,但是为了热爱所有好的,不要把它放在一个全局变量中:将它作为构造函数的一部分传递给任何对象你实例化将执行任何数据库操作。如果你需要功能并且变量或对象可以是你的主类私有的话,甚至可以将它包装在它自己的类中。

例如,假设您的主类是一个名为frmMain的表单,它在开始捕获用户名和密码时会生成一个登录对话框:

Public Class SessionManagerClass
    _dal As New DAL
    Private _sessionId As Int
    Private _userName As String

    Public Sub New(ByVal UserName As String, ByVal Password As string)
        _sessionId = _dal.Login(UserName, Password)
    End Sub

End Class

Partial Class frmMain
    Private _session As SessionManagerClass

    Public Sub frmMain_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim loginForm As New dlgLogin
        loginForm.ShowDialog()
        _session = New SessionManagerClass(loginForm.UserName, loginForm.Password)
        loginForm.Dispose()

    End Sub

    Public Sub btnLaunchChildForm_Click(ByVal sednder As Object, ByVal e As EventArgs) Handles btnLaunchChildForm.Click
        Dim frm As New frmChildForm(_session)

        frm.ShowDialog()
    End Sub

End Class


Partial Class frmChildForm

    _session As SessionManagerClass
    _dal As New DAL

    Public Sub New(ByVal Session As SessionManagerClass)
        _session = Session
    End Sub

    Private Sub DoSomething()
        If _dal.SaveValues(_session.SessionId, Value1, Value2, Value3) Then
            'All Good
        Else
            'Something went wrong. Maybe invalid session ID or perhaps you didn't validate your data. Whatever. Handle the problem if you can.
        End If
    End Sub

End Class

这绝不是工作代码,只是一个例子,说明如何让它开始。

答案 1 :(得分:1)

当您的应用程序退出时,您应该尝试从数据库中删除锁定,但是您无法阻止某人进入任务管理器并结束该过程。在这种情况下,您的应用程序不会收到任何关闭通知,因此无法写入数据库。

我们通过让用户请求unlock code一个允许他们清除登录标志的密码来处理这种情况。解锁代码每天都会更改,所以如果明天他们想要一个,他们就必须要求另一个。

答案 2 :(得分:1)

您可以通过单击项目并在应用程序检查Single instance application上使用内置功能Make Single instance application,因为屏幕截图显示

Make Single instance application

答案 3 :(得分:0)

检查整个方法:您可以使用Process课程。

Dim list() As Process = Process.GetProcessesByName(Process.GetCurrentProcess.ProcessName)
If list.Length > 1 Then
    Application.Exit()
End If

答案 4 :(得分:0)

那么, 我已经创建了一个新的解决方案 应使用名称currentsession创建另一个字段 当用户打开程序时,它需要一个数字 当发生联合国预期的关机时,我做了一个补丁,将当前状态更改为离线,并将会话ID更改为下一个号码 然后我在每个保存按钮中创建了一个检查子,以检查当前会话,如果它与数据库中的会话相匹配,它将继续 如果不是,它将关闭程序