2013-05-28 55 views
2

我正在使用後臺工作程序的程序,我試圖讓我的取消工作。當取消該程序時,我希望它更新我的數據庫(將其放入操作被取消的日誌中),併發送一封包含該狀態的電子郵件。取消後臺工作人員,更新數據庫和郵件

我有我的程序下面的代碼: (在後臺工作的頂部)

If bworker.CancellationPending Then 
    e.Cancel = True 
    Exit Do 
End If 

其中一期工程,並得到我的腳本bgworker_RunWorkerCompleted一部分。但從那裏分崩離析。我遇到了很多異常,它們或者像「操作被取消」一樣簡單,或者當它不應該嘗試調用處置對象時發生錯誤。

下面是RunWorkerCompleted代碼:)

Private Sub bgworker_RunWorkerCompleted(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs) Handles bgworker.RunWorkerCompleted 
    StopTimer() 

    If e.Cancelled Then 
     Call UpdateDB(e.Result(0), e.Result(1), e.Result(5), e.Result(2), e.Result(3), "Cancelled") 
     MessageBox.Show("Got Here - Cancelled") 
     CloseMe() 
    Else 
     MessageBox.Show("Got Here - Complete") 
     Call UpdateDB(e.Result(0), e.Result(1), e.Result(5), e.Result(2), e.Result(3), e.Result(7)) 
     CloseMe() 
    End If 
End Sub 

CloseMe(只關閉窗口,刪除一個托盤圖標,然後決定是否完全關閉該程序或只是回到主菜單。當我取消了該程序並且沒有第一個MessageBox.Show(取消部分內)時,我看到完成/未取消代碼區域內的消息框。一旦我放入取消區域的MessageBox.Show中,我開始獲得通用的「操作已取消」異常。

關於如何完成此操作的任何想法,以便操作可以被取消,同時允許它提醒我它已被取消並且不拋出異常?

謝謝!

回答

1

the documentation

你RunWorkerCompleted事件處理程序應經常訪問Result屬性之前檢查錯誤 和取消的屬性。如果發生 異常,或者操作被取消,則返回,則訪問 Result屬性會引發異常。

(重點煤礦)

我不知道什麼是你的Result對象,但有另一種可以發出信號的值回日誌的方式?
一個選項是而不是設置Cancel屬性,而是在您的Result對象中存儲某些內容以指示取消狀態。換句話說,就像操作成功一樣,在結果存儲區中顯示一個表示取消發生的標誌。

+0

謝謝傑夫,你的回答讓我走上了正確的道路。我最終做的是在全局聲明一個名爲results的數組(我已經在後臺工作者中使用它),然後在那裏設置所有的結果。一旦我到達runworker完成,如果它被取消,我只是引用該數組而不是e.Result,現在一切工作正常 –

+0

記住如果需要修改全局數組使用'Lock';看[這個答案](http://stackoverflow.com/a/4517075/55487) – Geoff