2012-02-10 12 views
0

スレッドが終了するのを待つために.Abort().Join()でスレッドの実行を停止します。しかし、問題は、.Join()がスレッドを終了したときと同じように、アプリケーションのブロックを決してしないということです。どうして?私のコード:スレッドが終了すると.Join()呼び出しがブロック解除されることはありません

th.Abort(); 
    Console.WriteLine("request sent, please wait.."); 
    th.Join(); 
    Console.WriteLine("done!"); 

上記のコードは、アプリケーションのロックを解除することはありませんが、それは正常に動作します:事前に

th.Abort(); 
Console.WriteLine("request sent, please wait.."); 
while (serverTh.ThreadState != ThreadState.Aborted) { 
      Thread.Sleep(500); 
} 
Console.WriteLine("done!"); 

感謝を。

+1

'Thread.Abort'ではありませんスレッドを終了させる良い方法です。これは、「Join」の後にさらに意味をなさないものになります。 –

+1

@ M.Babcockこれらのステートメントはどちらも間違っています。 Abort()は、.NETスレッドの終了を通知する方法であり、それに応じて処理する必要があります。 .Join()は、メインアプリケーションが終了する前にスレッドがシャットダウンするのを待つ適切な方法です。 – Timeout

+1

th!= serverTh。確かに、それはうまくいくかもしれません。 –

答えて

1

中止しようとしているスレッドではどうなっていますか?例えば、これは正常に動作します:

public static void Main(String[] args) 
    { 
     var t = new Thread(LoopForever); 
     t.Start(); 
     Thread.Sleep(500); 
     Console.WriteLine("request sent, please wait.."); 
     t.Abort(); 
     t.Join(); 
     Console.WriteLine("done!"); 
     Console.ReadLine(); 
    } 

    public static void LoopForever() 
    { 
     Console.WriteLine("Running!"); 
     while (true) 
     { 
      Thread.Sleep(100); 
      Console.WriteLine("Running!"); 
     } 
    } 

頭に浮かぶ唯一のことは、多分あなたのバックグラウンドスレッドがAbortExceptionをキャッチして、自身にResetAbortを呼んでいるされています

public static void Main(String[] args) 
    { 
     var t = new Thread(LoopForever); 
     t.Start(); 
     // Let the thread get started... 
     Thread.Sleep(500); 
     Console.WriteLine("request sent, please wait.."); 
     t.Abort(); 
     t.Join(); 
     Console.WriteLine("done!"); 
     Console.ReadLine(); 
    } 

    public static void LoopForever() 
    { 
      Console.WriteLine("Running!"); 
      while (true) 
      { 
       try 
       { 
        Console.WriteLine("Running!"); 
        Thread.Sleep(100); 
       } 
       catch (ThreadAbortException ex) 
       { 
        Console.WriteLine("Alas, I was aborted!"); 
        Thread.ResetAbort(); 
        Console.WriteLine("But behold, I live!"); 
       } 
      } 
    } 
関連する問題