我現在正在維護一個龐大而複雜的客戶端應用程序。爲了安全起見,它需要與服務器保持連接。它有一個線程處理它自己和服務器之間的所有套接字通信。表單處理時中止運行代碼?
當前編寫的方式,如果與服務器存在任何通信問題,通信線程將觸發一個事件,該事件關閉並處理所有打開的表單並將用戶返回到初始連接/登錄屏幕。
我遇到的問題是,有時這種溝通問題可能發生在函數的執行過程中(例如被模態窗體阻止的問題)。當模式表單和父表單處理完畢後,該功能仍然會結束運行,通常會導致異常和錯誤。
例如,報表有一個打開對話框的功能,接受輸入,然後運行基於該輸入的報告:
'Inside the class for the ReportForm:
Private Sub RunReport()
'Run code that requests list of reports from server
_ReportSelectionForm = New frmReportSelection(reportList)
_ReportSelectionForm.ShowInTaskbar = False
Me.AddOwnedForm(_ReportSelectionForm)
_ReportSelectionForm.ShowDialog(Me)
'the following code will still execute when ReportForm (Me) is disposed:
username = _ReportSelectionForm.txtUsername
If (_ReportSelectionForm.DialogResult = Windows.Forms.DialogResult.Ok) Then
'Run code
ElseIf (_ReportSelectionForm.DialogResult = Windows.Forms.DialogResult.Cancel) Then
'Run different code
End If
'etc
End Sub
因此,如果報表選擇表是開放和通信線程超時與服務器的通信,通信錯誤事件觸發關閉和配置ReportForm。這又會關閉_ReportSelectionForm對話框。發生這種情況時,即使父表單已被處置,也會在「_ReportSelectionForm.ShowDialog(Me)」之後運行代碼。這會在「_ReportSelectionForm.DialogResult」或「_ReportSelectionForm.txtUsername」上引發異常,因爲_ReportSelectionForm爲Nothing。
如果這是一個孤立的地方,我可以通過一些額外的檢查來處理這個問題,然後繼續運行該函數,但它遍佈這個大型程序。
處理這個問題的最佳方法是什麼?我可以在我正在關閉的表單上放棄執行代碼嗎?
希望我充分解釋了它。我的Google-Fu讓我失望。提前致謝。
搜索「CheckForIllegalCrossThreadCalls」的解決方案。刪除該代碼並正確執行。 –
我搜索了整個解決方案,並沒有提出任何意見。我記得在我的一些搜索中看到了這一點,並且不相信這個應用程序正在使用它。 關閉並處理所有打開的表單的Communication事件在做任何事情之前使用委託調用自己,我認爲這是圍繞CheckForIllegalCrossThreadCalls工作的。 – c4313622