0

私は、Windows サービスのマルチスレッド プロジェクトの途中にいます。正常に実行するには、皆さんからの入力が必要です。以下はコードで、私がやろうとしていることと問題を説明しています。

// I created a new thread and call MyTimerMethod() from the Main method.
private void MyTimerMethod()
{
    timer = Timers.Timer(5000)
    timer.Elapsed += new ElapsedEventHandler(OnElapsedTime);
    timer.Start();

    // make this thread run every time.
    Application.Run(); 
}

private void OnElapsedTime(object source, ElapsedEventArgs e)
{
    for(int i = 0; i < SomeNum; i++) //SomeNum > 0    
    ThreadPool.QueueUserWorkItem(WaitCallback(MyWorkingMethod),null);
}

private void MyWorkingMethod(object state)
{
    // each thread needs to go and check the status and print if currentStatus = true.
    // if currentStautus = true then that jobs is ready to print.
    // FYI ReadStatusFromDB() from the base class so I cannot modify it.

     ReadStatusFromDB(); // ReadStatusFromDB() contains jobs to be printed.
    // after doing some work store procedure update the currentStatus = false. 

    //do more stuff.
}

要するに、プログラムは 5 秒ごとに実行され、他にやるべきことがあるかどうかをチェックします。存在する場合は、スレッドプールから新しいスレッドを作成し、キューにプッシュします。今私の問題は、キューに複数のスレッドがある場合です。currentStatus = false であっても、複数のスレッドが同じジョブを取得して印刷を試みます。

さらに情報が必要な場合はお知らせください。

4

1 に答える 1

0

作業項目のBlockingCollectionを作成し、プログラムをプロデューサー/コンシューマーアプリケーションとして構造化することをお勧めします。ジョブが送信されると(タイマーティックまたはその他の方法で)、コレクションに追加されるだけです。

次に、 TryTakeを使用してコレクションを待機している1つ以上の永続スレッドがあります。アイテムがコレクションに追加されると、それらの待機中のスレッドの1つがそれを取得して処理します。

この構造にはいくつかの利点があります。まず、複数のスレッドが同じアイテムで動作するのを防ぎます。次に、アイテムを同時に処理するスレッドの数を制限します。第3に、スレッドはコレクションに対して非ビジー待機を実行しています。つまり、スレッドはCPUリソースを消費していません。唯一の欠点は、複数の永続スレッドがあることです。ただし、とにかくほとんどの時間アイテムを処理している場合は、永続スレッドはまったく問題になりません。

于 2012-10-16T17:12:44.300 に答える