我可以立即阻止线程运行.NET

时间:2011-05-25 11:26:26

标签: vb.net multithreading visual-studio-2010 abort

我在一个线程中运行以下代码来枚举活动目录中的本地计算机。这需要一些时间才能完成(大约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 个答案:

答案 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线程,它支持取消,请参阅此答案

C# Communication between threads

相关问题