0

サード パーティの COM オブジェクトと対話するアプリケーションがあります。呼び出した COM オブジェクトのメソッドが応答しなくなることがあります。関数を呼び出すための Backgroundworker スレッドを作成しました。メイン スレッドから監視して、ハングした場合に強制終了しようとしています。メインスレッドから system.timer を使用して処理時間を追跡する追加のコード (提供されていません) があり、しきい値を超えた場合にイベントを発生させます (この部分は問題ありません)。これは、スレッドを強制終了してコードの実行を停止したい場合です。問題は.. cancelasync メソッドを使用すると、コードの実行が関数呼び出しで停止するため保留になります。

ハングするコード スニペット内の特定の関数呼び出しは、「objCOM.SendDataToServer()」です。通常、戻るには1〜3秒かかりますが、応答がない場合は無期限にハングし、まったく返されません(エラーは発生せず、ハングするだけです)..タイムアウトはありません...そして私が持っていないのでソース機能へのアクセスは提供できません。スレッドの .dispose() メソッドを試してみましたが、どうやらそれはそれを殺さず、cancelasync も行いません。サーバー接続をリセットして関数を再度呼び出すことができるように、このスレッドをKILLする方法を理解するのに助けが必要です。どんな助けでも大歓迎です!

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
4

1 に答える 1

0

これを提案するのは少し躊躇しますが、Win32 API - Terminate threadの使用を検討することをお勧めします。

使用するのは非常に危険な API であり、アプリケーションを潜在的に危険な状態または一貫性のない状態にする可能性がありますが、特定のシナリオでは、これが私が考えることができる唯一の方法です。

別のプロセスで作業を実行することが許される場合は、Hans Passant の提案の方が適切です。スレッドではなくプロセスを終了する方がはるかに安全です。

于 2012-06-14T13:31:46.957 に答える