2014-09-11 54 views
1

我開發VB.Net應用程序,我想從敞開阻塞用戶程序的另一個會話,而他們已經有了一個如何處理意外停車vb.net申請下來

,所以我在由值我的數據庫,從離線變爲在線和反向根據日誌的狀態中

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

的問題是:有些時候程序掛起或Windows .....等等這樣的程序不要從Online更改該用戶的DB值到脫機,這阻止他打開應用程序

所以我如何處理意外關閉我的程序來處理這種情況?

+1

請問您可以添加一些代碼?關閉表格代碼,加載 – Hoh 2014-09-11 10:26:14

+0

程序的確切名稱是什麼(將在任務管理器中提供)? – 2014-09-11 10:58:13

+0

@Hoh普通的SQL語句從離線在線更改用戶狀態的形式加載和形式關閉 – user3290334 2014-09-11 13:25:11

回答

0

好, 我創建了一個新的解決方案 另一場應與名稱currentsession 創建當用戶打開它需要一定數量的 當聯合國預計停機發生我犯了一個補丁來改變當前的程序狀態離線和會話ID到下一個號碼 然後我在每個保存按鈕中創建一個檢查子檢查當前會話,如果它匹配數據庫中的一個,它將繼續 ,如果沒有,它將關閉程序

0

查看您的整個方法:您可以改爲使用Process類。

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

我認爲他要檢查,如果該人是記錄在不同的機器上。除此之外,您應該將「單實例應用程序」設置設置爲True,而不是執行此操作。 – 2014-09-11 11:00:31

1

你應該嘗試從數據庫時,你的應用程序退出解除鎖定,但你不能阻止別人進入任務管理器,結束進程。在這種情況下,您的應用程序不會收到任何關機通知,因此無法寫入數據庫。

我們通過讓用戶請求unlock code一個允許他們清除登錄標誌的密碼來處理這種情況。解鎖代碼每天都在變化,所以如果他們明天想要一個,他們必須要求另一個。

+0

那麼,在這種情況下,他可以使用此代碼到另一臺電腦上執行它,並再次登錄同一UN/PW – user3290334 2014-09-14 09:26:52

1

,你可以通過簡單的點擊您的項目和應用檢查Make Single instance application的屏幕截圖使用內置的功能Single instance application顯示

Make Single instance application

+1

這不會阻止在不同的機器上用戶登錄到這是OP – 2014-09-11 11:46:10

+0

的意圖應用你在說什麼lisencing? – user3980820 2014-09-11 12:45:54

+0

以及馬特說,它不會阻止用戶從不同的計算機 與同UN/PW打開,但你的信息是新的,我和另外一個問題幫助:) – user3290334 2014-09-14 09:24:07

2

我覺得你在這裏談論的用戶會話管理。如果我正確地理解了你,你想停止任何一個用戶同時登錄到兩個實例,而不是一次打開兩個應用程序副本(顯然不同的用戶登錄到每個副本)。如果是這種情況,那麼實現非常基本的東西實際上並不困難。

當您的用戶登錄時,請檢查他們是否已在您的會話表中有記錄。如果沒有,則創建一個並使用會話標識發出該用戶。這個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 

這是沒有辦法運行的代碼,只是一個例子你可能會怎麼做才能讓你開始。

+0

我知道,這個解決方案會照顧到這一點,同時仍然阻止用戶進行兩個活動會話。我認爲問題不是真的有兩個應用程序副本打開,而是有一個用戶登錄了兩個活動會話,以及如何防止該問題,同時仍能夠應對意外關閉。 – 2014-09-11 14:41:40