2012-06-10 24 views
0

我有一個與第三方COM對象交互的應用程序。我調用的COM對象的方法有時會停止響應。我創建了一個Backgroundworker線程來調用該函數,我試圖從我的主線程監視它,以便在它掛起時將其殺死。我有額外的代碼(未提供)跟蹤來自主線程的system.timer的處理時間,如果事件超過我的閾值(這部分沒有問題),我會引發一個事件。這是當我想殺死線程並停止代碼執行。問題是..如果我使用cancelasync方法,它只會掛起,因爲代碼執行停留在函數調用中。如果線程掛起,就殺死VB.net中的BackgroundWorker - 使用COM對象

掛起代碼片段中的特定函數調用是「objCOM.SendDataToServer()」。它通常需要1-3秒才能返回,但如果沒有響應,它將會無限期地掛起,並且根本不會返回(沒有錯誤掛起)..沒有超時...因爲我沒有訪問源函數我不能提供一個。我嘗試了線程的.dispose()方法,但顯然這並不會殺死它,也不會執行cancelasync。我只需要幫助搞清楚如何殺死這個線程,以便我可以重置服務器連接並再次調用該函數。任何幫助深表感謝!

Public Class COMobject 
    Private objCOM as new acs.manager 

    Public Sub CallComFunction() 
     Dim bw_com as New Backgroundworker 
     AddHandler bw_com.DoWork, AddressOf bw_com_dowork 
     AddHandler bw_com.RunWorkerCompleted, AddressOf bw_com_runworkercompleted 
     AddHandler bw_com.ProgressChanged, AddressOf bw_com_progresschanged 

     bw_com.WorkerReportsProgress = True 
     bw_com.RunWorkerAsync() 
    End Sub 

    Private Sub bw_com_dowork(byval sender as object,byval e as doworkeventargs) 
     'this is the long running function that will hang 
     call objCOM.SendDataToServer() 
    End sub 
End Class 
+0

你不能殺死一個掛起的線程,Thread.Abort也不能工作。在單獨的進程中運行此代碼,以便可以終止進程。 –

回答

0

我有點猶豫,建議這一點 - 但你可能要考慮使用Win32 API - Terminate thread

這是一個非常危險的API使用,可能會使您的應用程序處於潛在危險/不一致的狀態,但對於給定的場景 - 這是我可以考慮的唯一方法。

如果允許在單獨的過程中執行工作 - 漢斯帕斯坦的建議是更好的。終止一個進程而不是一個線程要安全得多。