Могу ли я немедленно остановить поток от запуска .NET - PullRequest
0 голосов
/ 25 мая 2011

У меня есть следующий код, выполняющийся в потоке для перечисления локальных машин в активном каталоге. Это займет некоторое время для завершения (около 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 ]

2 голосов
/ 25 мая 2011

Идея может заключаться в управлении свойством 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 голос
/ 25 мая 2011

Если вы используете поток BackgroundWorker, он поддерживает отмену, см. Этот ответ

C # Связь между потоками

...