1

リモート コンピューターで wmi クエリを起動するコード。このコードは、同時に複数のスレッドで実行されます。

oquery = New ManagementObjectSearcher("select * from Win32_Computersystem")
oquery.Options.ReturnImmediately = True
oquery.Options.Rewindable = False
oquery.Options.Timeout = New TimeSpan(0, 8, 0)
oquery.Scope = mycomputer.omsWMI 'timeout of omswmi is set to (0,1,0)

For Each objMgmt In oquery.Get 'on some pesky windows XP machines this line hangs forever regardless of the timeout and the thread can never be used to get info from another computer. the only way to "release" this is to reboot the target computer.
   'do stuff    
next

メインスレッドで実行されるコード:

Public Sub KillLongRunningThreads()
    Dim tel As Integer
    SyncLock LockMythreadlist
            For tel = MyThreadlist.Count - 1 To 0 Step -1
                If CType(MyThreadlist(tel), wmithread).Starttime < Now.AddMinutes(-120) Then
                    DBG("INFO: before threadabort")                  
                    Try
                        'this line tries to abort the first thread but is also hanging forever, the INFO:after threadabort is never reached.
                        'even worse this line hangs in the middle of a synclock which causes the program to stop working (all other threads are waiting for the end syncklock.
                        CType(MyThreadlist(tel), wmithread).TheThread.Abort()
                    Catch ex As Exception
                        DBG(ex.Message & ex.StackTrace)
                    End Try
                    DBG("INFO: after threadabort")
                    MyThreadlist.RemoveAt(tel)
                End If
            Next
    End SyncLock
End sub

2 つの質問:

最初のスレッドを停止するには?

最初のスレッドを停止し、デッドロックを作成しない方法は?

4

1 に答える 1

3

Thread.Abortのドキュメント:

f Abort がマネージド スレッドでアンマネージド コードの実行中に呼び出された場合、スレッドがマネージド コードに戻るまで ThreadAbortException はスローされません。

スレッドがアンマネージ コードでハングしているように見えるため、マネージ スレッドを中止しても何も起こりません。

スレッドが WMI クエリでハングしないようにする方法や、ハングしている WMI クエリをキャンセルする方法がわかりません。

于 2011-09-15T18:12:04.753 に答える