2016-08-19 4 views
-1

ich einen eingeschränkten Ausführungsbereich (CER) unter Verwendung den Codeabschnitt innerhalb einer while-Schleife eines Fadens zu schützen:Wie auszubrechen eine Schleife enthält nur einen eingeschränkten Ausführungsbereich (CER)

private static void MyThreadFunc() 
{ 
    try { 
     ... 
     while (true) 
     { 
      RuntimeHelpers.PrepareConstrainedRegions(); 
      try { } 
      finally 
      { 
       // do something not to be aborted 
      } 
      Thread.Sleep(1); // allow while loop to be broken out 
     } 
    } 
    catch (ThreadAbortException e) 
    { 
     // handle the exception 
    } 
} 

Das Problem ist, wenn ich die Thread.Sleep(1)-Anweisung am Ende der While-Schleife nicht einführen, jeder Versuch, Thread.Abort() auf den Thread aufzurufen, hängt. Gibt es eine bessere Methode zum Abbrechen des Threads ohne die Thread.Sleep() Funktion zu verwenden?

Antwort

0

Ich weiß nicht, warum Sie den Thread manuell abbrechen müssen, da CLR es nach der Fertigstellung erledigt oder Thread.Join wartet, bis es beendet wird. Aber Sie können die ManualResetEvent verwenden, um es elegant abzubrechen.

Ich habe durch den Austausch des while (true) im Code einige Änderungen vorgenommen mit der ManualResetEvent

class ThreadManager 
{ 
    private ManualResetEvent shutdown = new ManualResetEvent(false); 
    private Thread thread; 

    public void start() 
    { 
     thread = new Thread(MyThreadFunc); 
     thread.Name = "MyThreadFunc"; 
     thread.IsBackground = true; 
     thread.Start(); 
    } 

    public void Stop() 
    { 
     shutdown.Set(); 
     if (!thread.Join(2000)) //2 sec to stop 
     { 
      thread.Abort(); 
     } 
    } 

    void MyThreadFunc() 
    { 
     while (!shutdown.WaitOne(0)) 
     { 
      // call with the work you need to do 
      try { 
        RuntimeHelpers.PrepareConstrainedRegions(); 
        try { } 
        finally 
        { 
         // do something not to be aborted 
        } 
       } 
       catch (ThreadAbortException e) 
       { 
         // handle the exception 
       } 
     } 
    } 
} 
Verwandte Themen