Могу ли я немедленно остановить поток от запуска.NET
У меня есть следующий код, выполняющийся в потоке для перечисления локальных машин в активном каталоге. Это займет некоторое время (около 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()
2 ответа
Если вы используете поток BackgroundWorker, он поддерживает отмену, см. Этот ответ
Идея может заключаться в том, чтобы управлять 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, как часть вашей логики отмены, и ожидайте, что процесс остановится раньше.