2011-05-25 103 views
0

我在線程中運行以下代碼以枚舉活動目錄中的本地計算機。這需要一些時間才能完成(大約5-10秒),因此如果用戶在枚舉完成之前退出應用程序,應用程序需要5-10秒才能退出。我試過thread.abort,但因爲它正在等待For Each SubChildEntry In SubParentEntry.Children完成它不會中止,直到這返回。我可以立即停止運行.NET的線程:

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

你能告訴我們你用來創建和啓動一個新線程的代碼嗎? – 2011-05-25 11:30:01

回答

1

如果您使用的是BackgroundWorker的線程,它可以支持取消,看到這個答案

C# Communication between threads

+0

我已經改變了代碼使用後臺工作人員 - 這是現在按預期工作 - 謝謝 – 2011-05-25 12:03:29

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真爲你着性的一部分邏輯推理並期望該過程儘快停止。

+0

我有這個想法,但它是'對於每一個x在y'行,正在花時間來響應,所以'If(CancelPending )然後'在執行完成之前不會執行 – 2011-05-25 11:57:05