2016-08-29 5 views
2

私は、T1と呼ばれるメインスレッドをしました:このメソッドUpdateResultというメソッドを実行スレッドが再帰的に実行されているかどうかを確認しますか?

Thread t1 => new Thread(UpdateResults); 

は、インターネット接続が必要です。今や接続が壊れることがあります。

接続が切断されると、メソッドUpdateResultが例外を返し、スレッドt1が実行を終了します。

私は再びスレッドt1を実行する必要があるので、私もスレッドt1が実行中かNOである場合、再帰的にチェックしていない別のスレッドt2を作成します。

両方のスレッドが自動的に開始されます。これは、スレッドt2メソッドのコードです:

while (true) 
{ 
    if (!t1.IsAlive) 
    { 
     t1.Start(); 
    } 
} 

このコードunfortuntelyアプリのUIを遅く、「原因は無限ループです。 これを修正するために私が代わりにできることは何ですか?代わりにちょうどt1を見るために別のスレッドt2を無駄に、あなたがスレッドt1の方法を変更することを検討して

+0

'try..catch'ブロックで' UpdateResults'をラップしますか? – BlackBear

+0

@BlackBearはすでにtry catchブロックに入っていますが、例外がスローされた場合、スレッドは実行を終了します – AgainMe

+0

スレッドではなく、再試行/接続を 'updateresults'してもいいと思います。スレッドは、作業が完了したかどうかを知るテスターではなく、作業が完了した場所でなければなりません。 –

答えて

2

:(!それを再スローすることなく、

Thread t1 = new Thread(o => 
{ 
    while (true) 
    { 
     try 
     { 
      UpdateResult(); 
     } 
     catch (Exception) 
     { 
      // do some error handling 
     } 
     Thread.Sleep(100); 
    } 
}); 

ですから、例外をキャッチし、クラッシュを防ぎ全体のスレッドの。

もちろんこれは単なる例です。壊れた接続の特定の例外だけをキャッチして、適切なエラー処理(ログなど)を追加するようにしてください。
スレッドが必要に応じてスリープする時間を調整します。無限のポーリングを回避するために

+0

私はこのソリューションが本当に好きですが、コードで正常に動作しているようです。すべてに感謝;) – AgainMe

2

一つのアプローチは、Joinにスレッドである、そして再スポーンそれが停止したとき:

while (true) { 
    t1.Join(); 
    t1 = ... // Make a replacement thread 
    t1.Start(); 
} 

をこれはUIスレッドから実行すべきではないことは言うまでもない、Join()ブロック理由無期限に。

1

アーキテクチャーに固執したい場合は、スレッドt2の各ループで1秒待つだけの簡単な方法で、パフォーマンスが大幅に向上します。

while (true) 
{ 
    if(!t1.isAlive) 
    { 
     t1.Start(); 
    } 
    Thread.Sleep(1000); 
} 

(。あなたのコンテキストで理にかなって何に時間を調整することができます)

代わりに、このマルチスレッド・ソリューションを、私が求めるだろうけど:なぜスレッドt1が終了しない例外のため?あなたはtry - catchブロックでそれをキャッチすることができます。

void SafeUpdateResults() 
{ 
    while (true) 
    { 
     try { UpdateResults(); } 
     catch (Exception e) 
     { 
      //track the Error if you want 
      Console.WriteLine("t1-Error: " + e.Message); 
     } 
    } 
} 

これはここに間違いなく簡単にですが、私は(たとえ機能UpdateResults()に入るとそれが起こる例外権利をキャッチ、お勧め、それに応じて反応します:代わりにちょうど言うUpdateResultsコールSafeUpdateResults

)。

+1

私の謙虚な評判のための探求は、より速いポスターでもう一度挫折しました。 – TheHowlingHoaschd

+0

とにかくお時間をありがとう。 – AgainMe

+0

ありがとう^^といくつかの冗長性は決して痛くない。 – TheHowlingHoaschd

関連する問題