私のアプリケーションはライブフィードからデータを取得し、一度にライブフィードを1回だけ呼び出すことができます。私は約20のシナリオでforeachを呼び出し、次にこれらのシナリオのそれぞれに対してライブフィードを15回呼び出す必要があります。次のセマフォをリリースするまで、セマフォが解放されないようにする方法は?
私はスレッディングには新しく、インターネットと読書を通してトローリングした後、最終的にセマフォを使用することに決めました。しかし、私は、シナリオのためのライブフィードがその特定のシナリオで15回呼び出されるまで、セマフォー(シナリオの_pool)を待機状態にする方法を見つけることができません。
この問題(私はそこにあると確信しています)より洗練されたソリューションがある場合は、私は感謝します ありがとうございます。今度はいずれか一方のみPを持っているために、1つ以上の追加のスレッド( AT )を生成しますことをプライマリスレッド(P)またはいくつかのワーカースレッド(W)のいずれかを有するか、
private void button1_Click(object sender, EventArgs e)
{
_pool = new Semaphore(0, 1);
foreach (string s in str)
{
Thread n = new Thread(new ParameterizedThreadStart(method1));
n.Start(venue);
}
_pool.Release(1);
}
static void method1(object venue)
{
_pool.WaitOne();
for (int i = 1; i <= numThreads; i++)
{
string composite = i.ToString() + "," + venue;
Thread n = new Thread(new ParameterizedThreadStart(method2));
n.Start(composite);
}
_pool.Release(); //I need to ensure that this is called only after all threads
// spawned in the for loop corresponding to foreach thread are
// executed. But how?
}
static void method2(object i)
{
_pool2.WaitOne();
//Call to data engine and storing data in txt file
Thread.Sleep(100);
_pool2.Release();
}
興味深い質問ですが、当初私はそれらのマシュマロクッキーのことを考えていましたが、 – heisenberg
間違った同期オブジェクト、セマフォーは間違った方法を数えています。必要なのは、すべてのスレッドでThread.Join()です。または、スレッドによってSet()であるAutoResetEventのWaitAll()。 –