2012-05-11 7 views
1

私はいくつかのイベントを永遠に追跡するwhileループを実行しています。例外が発生した場合、現在のスレッドが中止され、そのスレッドの新しい参照が作成されることを期待してnullへの参照を変更しています。現在のスレッドを中止して新しいスレッドを開始するのは正しいか、それとも良い方法でしょうか。スレッドの参照をnullに変更するとどうなりますか?

私はこれを行うにしようとしています:

Thread th; 

Main() 
{ 
    th = new thread(myfunction); 
    th.Start(); 
} 

void myfunction() 
{ 
    while(true) 
    { 
     try 
     { 
      // something interesting here. 
     } 
     catch(exception) 
     { 
      th = null; 
     } 
    } 
} 
+0

なぜあなたは新しいスレッドを作成したいですか? –

答えて

1

は、このようなwhileループから抜け出すそして、あなたがそのスレッドのために必要なものをクリーンアップします。

void runningOnThread() 
{ 
    while (true) 
    { 
     try 
     { 
      //... 
     } 
     catch (Exception e) 
     { 
      break; 
     } 
    } 

    //thread cleanup code goes here, if you have any. 
} 

それが良いでしょうあなたがそれをキャッチするときに例外を記録するアイデア。そうすれば、例外が発生したときを知ることができます。どうなる

+2

例外をすべてキャッチしないと、CLR 2のデフォルトの動作であるため、アプリケーションドメインのシャットダウンが正しく行われない可能性があります。その例外をログに記録する方が良いでしょう(アプリケーションの種類によっても続けるか、 )。 – Steven

+0

@Steven興味深い、私が言いましたとき、私はそれをスレッディングと具体的に考えていませんでした...一般的には、処理できる例外をキャッチして残りの部分を投げるのが良い方法ですが、別のスレッドの内側でこれが反対になることは意味があります。私の答えを更新... –

+0

絶対に。一般的なルールは、処理できる例外をキャッチすることだけですが、スレッド境界の周りの例外を処理するには少し注意が必要です。 – Steven

1

だけの事は、スレッドは、囲むクラスからアクセスできませんということです。

それ以上の処理が存在しない場合は、GC appllication rootsから手の届かないところに糸を行いますそう。これにより、次のGCトリガでガベージコレクションに使用できるオブジェクトが作成されます。

+0

実際これは私の答えよりも正確かもしれません。実際のコード(実際のWindowsスレッド)は実行されたまま、スレッドオブジェクトが収集される可能性があります。 – Steven

1

あなたは何をする必要があります:スレッドが実行し続けますので

th = null; 

return; 

の代わりに。スレッドオブジェクトは、コードが実行されている限り参照されたままになるため、収集されません。あなたは例外に実行する場合

1

まず、新しいスレッドを開始を心配する前に、あなたが実際に例外を処理し、再起動のスレッドが正常に実行できるようになることを保証することを確認してください。さもなければ、あなたはクラッシュするスレッドの一定のストリームを取得し、例外パレードを処理している間は不安定なプログラムを取得します。思考のためのちょっとした食べ物。

質問に答えて、スレッドへの参照をnullにすると無限ループになります。最悪の場合、後で 'th'を使用しようとすると、nullなので例外が発生します。スレッドへの参照をヌルにしても、何らかの形で関数の引数として渡したパラメータへの参照をnullにすること以外に、自分自身を再起動する必要があることを認識させることはありません。あなたは絶対に/スレッドを再開中止する機能のいくつかの種類が必要な場合は、のいずれかの操作を実行に見て:

  1. /ブール値を設定するときに、スレッドがクラッシュしたイベントを高め、whileループから抜け出す、または
  2. スレッドが何をしているのかを示すenumフラグを設定し、エラー状態に設定されていないことを確認するためにメインスレッドのチェックを頻繁に行います。

これは、コードが私の頭の上から完全に良いことではないですが、あなたの一般的な考え方与える:

delegate void ThreadCrashedEvent(); 
Event ThreadCrashedEvent threadCrashed; 

Thread th; 

Main() 
{ 
    threadCrashed += OnThreadCrashed(); 
    th = new thread(myfunction); 
    th.Start(); 
} 

void OnThreadCrashed() 
{ 
    th = new thread(myfunction); 
    th.Start(); 
} 

void myfunction() 
{ 
    while(true) 
    { 
     try 
     { 
      LetsGetDangerous(); 
     } 
     catch(exception) 
     { 
      if(threadCrashed != null) 
      { 
       threadCrashed(); 
       return; 
      } 
     } 
} 
関連する問題