2

次の記事のコードを使用して、独自の ThreadPool を実装しました: http://www.developer.com/net/article.php/3783756

これが私が達成したいことです。タイマーを介してトリガーされたサービスは、新しいジョブを実行するために 5 秒ごとにデータベースにクエリを実行する必要があります。ジョブは基本的に、引数を指定して実行する必要があるコマンドライン プログラムに関する情報のみです。

これらのプログラムは、最大 50 個以上同時に実行できる必要があります。プログラムは、数秒、数分、さらには数時間実行できます。サービスは、これらのプログラムを常に制御する必要があります。つまり、たとえば、要求に応じてプログラムを強制終了できる必要があります。

上記の ThreadPool 実装を使用して、実行するプログラムをキューに入れ始め、サービスが実際にいつそれらを実行したかを確認できました。今のところ問題ありません。ただし、ここでのメカニズムは次のように機能します。

ThreadPool はワーカースレッドを作成して開始します。プログラムがキューに入れられるたびに、ワーカースレッドはこれを認識し、本質的に System.Diagnostics.Process オブジェクトをインスタンス化して外部プログラムを開始するデリゲートを呼び出します。その後、スレッドはその作業を終了し、さらにプログラムを開始できるようになります。ただし...開始するプログラムがない場合、アイドルタイマーによりスレッドマネージャーがスレッドを強制終了し、開始されたプロセスを中断します。

これは私が必要とするものではありません。ここで誰かが、私がよりよく説明したシナリオを処理する方法を知っていますか?

4

3 に答える 3

3

1) このプロセスでスレッドが終了すると、他の開始されたプロセスが終了するのはなぜですか? その質問に答えれば、問題は解決したことになります。

2) それはかなりお粗末で、かなりナイーブな ThreadPool の記事のように見えます。カスタム スレッド プールに関するJoe Duffy のシリーズ (パート 1パート 2、およびパート 3 ) を参照してください。このようなコードは驚くほど複雑で、それ自体がかなりのメンテナンス負担になります。

3) (本当の答え) なぜこれを行うためにスレッドプールを使用しているのですか? スレッドプールは一度に 1 つのスレッドしか使用しません。タイマーを使用してメインスレッドをトリガーしてみませんか? あなたのアプリは、応答性を維持するために必要な UI 以外のことを行っていますか?

スレッドプールを取り除きます。必要はありません。それはあなたの人生を困難にしています。スレッドプールは一般に、長時間実行されるタスクをホストするようには設計されていません。それが個々のスレッドの目的です。別のスレッドでタイマーをトリガーする必要がある場合は、それを処理するスレッドを作成し、この同じスレッドを使用してすべてのプロセスを生成します。その後、プロセスの状態を 1 つの中央の適切な場所で追跡できます。:)

于 2009-06-09T11:19:19.603 に答える
1

スレッドプールがこれを処理する最適な方法であると確信していますか? ほとんどアイドル状態になるが、プロセスが終了するまで存在しなければならないプロセスごとに新しいスレッドを生成することは、スレッドの無駄のように思えます。

これらすべてを単一のスレッドとプロセスのディクショナリで実装します。スレッドは、データベースとすべてのプロセスに対して定期的にクエリを実行し、実行する必要があるアクションを確認します。

于 2009-06-09T11:19:21.710 に答える
0

私の知る限り、Process.Start によって生成されたプロセスは、Process.Start を呼び出すスレッドが終了しても引き続き実行されます。次のコードはこれを示しています。メイン プログラムが終了した後も、LongRunningApp.exe は引き続き実行されます。

static void Main(string[] args)
{
    Process p = new Process();
    ProcessStartInfo psi = new ProcessStartInfo(@"C:\LongRunningApp.exe");
    psi.CreateNoWindow = true;
    psi.UseShellExecute = false;
    p.StartInfo = psi;
    p.Start();
    Console.ReadLine();
}
于 2009-06-09T11:33:04.180 に答える