私には2つのスレッドがあり、1つは更新を探すために多数の個別の静的リソースをポーリングする必要があります。もう1つは、データを取得してデータベースに保存する必要があります。スレッド1は、処理するものがあることをスレッド2にどのように伝えることができますか?
4 に答える
データが独立している場合は、データをスレッドのプールによって処理される作業項目として扱います。スレッドプールを使用してQueueUserWorkItem
、データをスレッドに投稿します。対称スレッドのプールを使用し、プロデューサーとコンシューマーの間で発生する必要のある同期の量を制限することで、スケーラビリティを向上させる必要があります。
例(MSDNから):
TaskInfo ti = new TaskInfo("This report displays the number {0}.", 42);
// Queue the task and data.
if (ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc), ti)) {
Console.WriteLine("Main thread does some work, then sleeps.");
// If you comment out the Sleep, the main thread exits before
// the ThreadPool task has a chance to run. ThreadPool uses
// background threads, which do not keep the application
// running. (This is a simple example of a race condition.)
Thread.Sleep(1000);
Console.WriteLine("Main thread exits.");
}
else {
Console.WriteLine("Unable to queue ThreadPool request.");
}
// The thread procedure performs the independent task, in this case
// formatting and printing a very simple report.
//
static void ThreadProc(Object stateInfo) {
TaskInfo ti = (TaskInfo) stateInfo;
Console.WriteLine(ti.Boilerplate, ti.Value);
}
作業項目のキューでMonitor.Wait/Pulseを使用します。
「DBに保存」スレッドは常に実行されている必要がありますか?おそらく最良のオプション(可能であれば)は、ポーリングスレッドに別のスレッドをスピンアップさせて保存を行うことだと思われます。ただし、作成されるスレッドの数によっては、最初のポーリングスレッドでThreadPool.QueueUserWorkItem()を使用する方が効率的なルートである可能性があります。
効率を上げるために、データベースに保存するときは、同期メソッドではなく、DBで非同期I/Oを使用します。
2つのスレッド間で直接通信する必要がなくなる場合は、いつでもそうする必要があります。いくつかの同期プリミティブをまとめる必要があるため、コードのデバッグは簡単ではなく、「100万回に1回の実行」タイプのバグ(検索/修正するのは楽しいことではありません)を引き起こす非常に微妙な競合状態が発生する可能性があります。
2番目のスレッドを常に実行する必要がある場合は、理由をもう少し詳しく教えてください。より詳細な回答を返すことができます。
幸運を!
個人的には、スレッド 1 でスレッド 2 が応答できるイベントを発生させます。スレッドは、両方のスレッドを開始する制御プロセスによって適切なイベントに結び付けることができます。