2011-01-19 22 views
1

未処理の例外をサポートしないマルチスレッドWindowsサービス(C#、.NET)を継承しました。このサービスは、複数のスレッドを使用して、分析のために遠隔測定装置からデータを収集しています。このサービスのスレッドは24時間以上実行できます。私はスレッドが問題を経験しており、リサイクルする必要があることをメインスレッドに伝える方法に苦しんでいます。スレッド:C#を使用した.NET Windowsサービスのメインスレッドへのコール

class Program 
{ 
    static void Main(string[] args) 
    { 
    var workerObject = new WorkerObject(); 
    var workerThread = new Thread(workerObject.DoWork); 
    workerThread.Start() 
    } 
} 

class WorkerObject 
{ 
    //todo: My fields and properties go here 

    public void DoWork() 
    { 
    const int timeout = 100; 

    //todo: setup wait handles here 

    try 
    { 
     //Start monitoring channels for this device 
     while (true) 
     { 
     // Wait on any waithandle or timeout once per decisecond. 
     int channelIndex = WaitHandle.WaitAny(waitHandles, timeout, false); 

     //todo: process incoming data for this channel 
     } 
    } 
    //Catch all exceptions so we can notify mommy that we're in a bad way 
    catch (Exception ex) 
    { 
     //todo: log anything that can help us figure this problem out 

     //How do I tell the main thread I've failed 
    } 
    finally 
    { 
     //But of course we want to clean up after ourselves 
    } 
    } 
} 

これは最高の.NETスレッド化メカニズムですか?代わりにAsync DelegatesまたはTask Parallel Libraryを使用する必要がありますか?

答えて

2

私は最近同様の要件を持っていました。私はあなたが悪い時に親に伝える子スレッドに頼ることができるとは思わない。無限ループに巻き込まれたり、何らかの理由でデッドロックされたりするとどうなりますか?私は「ウォッチドッグ」アプローチで解決しました。子スレッドのそれぞれは、メインスレッドに「ハートビート」を返す必要がありました。この信号が受信されなかった場合、スレッドは「死んだ」とみなされ、アクションがとられる可能性があります。ここで私は上で定住アーキテクチャについての記事されています

http://blog.bobcravens.com/2009/08/monitored-watchdog-asynchronous-process-in-c/

は、この情報がお役に立てば幸いです。

ボブ

+0

あなたはあなたのコードにsouceへのリンクを追加できますか?何かを理解することは不可能です。 – IamStalker

0

ダニエル蛾は、マルチスレッドについて多くのことをブログに書いていますし、最近で並列タスクは、.NET 4.0でサポートされています。それは素晴らしいリソース、http://www.danielmoth.comと非常に興味深いです。私は間違いなくそれをチェックするだろう。

これが役立つかどうかわかりませんが、キューからジョブを取り出してThreadPoolで作業をスケジュールする「Report Runner」Windowsサービスで作業しました。これは正常に機能しました。なぜなら、「レポート」が失敗した場合、エラーを記録して終了するだけで、それがThreadPoolでスケジュールされていたからです。 ThreadPoolを使用すると、実行しているコードが失敗した場合に新しいスレッドのスピンアップを管理するために必要なコードが不要になります。

関連する問題