Thread.abort永远挂起

时间:2011-09-15 18:05:48

标签: .net vb.net multithreading thread-abort

在远程计算机上启动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

两个问题:

如何停止第一个帖子?

如何停止第一个线程而不是造成死锁?

1 个答案:

答案 0 :(得分:3)

Thread.Abort的文档中:

  

f在托管线程执行非托管代码时调用Abort,在线程返回托管代码之前不会抛出ThreadAbortException。

由于您的主题似乎挂在非托管代码中,因此中止托管主题并不会做任何事情。

我不知道如何阻止线程在WMI查询中挂起,或者如何取消挂起的WMI查询。