我在一个线程中运行以下代码来枚举活动目录中的本地计算机。这需要一些时间才能完成(大约5-10秒),因此如果用户在枚举完成之前退出应用程序,则应用程序需要5-10秒才能退出。我尝试过thread.abort,但因为它等待For Each SubChildEntry In SubParentEntry.Children
完成,所以在它返回之前不会中止。
Dim childEntry As DirectoryEntry = Nothing
Dim ParentEntry As New DirectoryEntry
ParentEntry.Path = "WinNT:"
For Each childEntry In ParentEntry.Children
Windows.Forms.Application.DoEvents()
Select Case childEntry.SchemaClassName
Case "Domain"
Dim SubChildEntry As DirectoryEntry
Dim SubParentEntry As New DirectoryEntry
SubParentEntry.Path = "WinNT://" & childEntry.Name
'The following line takes a long time to complete
'the thread will not abort until this returns
For Each SubChildEntry In SubParentEntry.Children
Select Case SubChildEntry.SchemaClassName
Case "Computer"
_collServers.Add(SubChildEntry.Name.ToUpper)
End Select
Next
End Select
Next
RaiseEvent EnumComplete()
答案 0 :(得分:2)
这个想法可能是管理一个CancelPending
属性,可以安全地设置和检查,以确定是否应该执行:
For Each j In k
If (CancelPending) Then
Exit For
End If
...
Select ...
Case "a"
...
For Each x In y
If (CancelPending) Then
Exit For
End If
...
Next
End Select
Next
您可以将CancelPending
设置为true作为取消逻辑的一部分,并期望该过程更快停止。
答案 1 :(得分:1)
如果您使用的是BackgroundWorker线程,它支持取消,请参阅此答案