0

Active Directory 内のローカル マシンを列挙するために、次のコードをスレッドで実行しています。これは完了するまでに時間がかかるため (約 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()
4

2 に答える 2

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

キャンセルロジックの一部としてtrueに設定CancelPendingし、プロセスがより早く停止することを期待できます。

于 2011-05-25T11:40:17.633 に答える
1

BackgroundWorker スレッドを使用している場合は、キャンセルがサポートされています。この回答を参照してください

C# スレッド間の通信

于 2011-05-25T11:33:55.950 に答える