2014-01-13 46 views
0

我現在正在維護一個龐大而複雜的客戶端應用程序。爲了安全起見,它需要與服務器保持連接。它有一個線程處理它自己和服務器之間的所有套接字通信。表單處理時中止運行代碼?

當前編寫的方式,如果與服務器存在任何通信問題,通信線程將觸發一個事件,該事件關閉並處理所有打開的表單並將用戶返回到初始連接/登錄屏幕。

我遇到的問題是,有時這種溝通問題可能發生在函數的執行過程中(例如被模態窗體阻止的問題)。當模式表單和父表單處理完畢後,該功能仍然會結束運行,通常會導致異常和錯誤。

例如,報表有一個打開對話框的功能,接受輸入,然後運行基於該輸入的報告:

'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讓我失望。提前致謝。

+0

搜索「CheckForIllegalCrossThreadCalls」的解決方案。刪除該代碼並正確執行。 –

+0

我搜索了整個解決方案,並沒有提出任何意見。我記得在我的一些搜索中看到了這一點,並且不相信這個應用程序正在使用它。 關閉並處理所有打開的表單的Communication事件在做任何事情之前使用委託調用自己,我認爲這是圍繞CheckForIllegalCrossThreadCalls工作的。 – c4313622

回答

0

你的代碼更改爲:

Dim result as DialogResult = _ReportSelectionForm.ShowDialog(Me) 

If (result = Windows.Forms.DialogResult.Ok) Then 
    'Run code 
ElseIf (result = Windows.Forms.DialogResult.Cancel) Then 
    'Run different code 
End If 

你不引用ReportSelectionForm這樣。

+0

這絕對是更好的做法。然而,函數中還有其他部分可能會出錯,所以這不一定能解決所有問題。例如,我編輯了上面的代碼示例,因爲此特定函數也會訪問_ReportSelectionForm.txtUsername,它會遇到同樣的錯誤。 – c4313622

+0

代碼不應該訪問'_ReportSelectionForm.txtUsername',除非返回值是'DialogResult.Ok'。因爲它不會(至少,它不應該是因爲你取消對話),這應該不成問題。 –

+0

嘿,你說的沒錯。我的例子很差。代碼中還有其他地方只是抓取對話框的結果將不起作用,因爲代碼也在訪問表單中的某些內容,例如_ReportSelectionForm.txtUsername(上面的編輯示例)。程序中有許多地方會出現這樣的錯誤,並且不會通過訪問類似的結果來解決。但也許沒有辦法放棄運行這些腳本,我只需要通過並識別所有這些地方並手動輸入「if(frmExampleDialog Is Nothing)」檢查。謝謝你的幫助。 – c4313622