質問: 0; Task.Run(() => { for (;;) { iIdx++; Task.Run(() => { My_Func(iIdx); }); Console.WriteLine("処理1"); Console.WriteLine("処理2"); Thread.Sleep(10); } }); } void My_Func(int iIdx) { Console.WriteLine(iIdx.ToString()); Thread.Sleep(20000); } ``` 上のコードで質問です。 やりたいことは、別スレッド(スレッドA)で無限ループさせて My_Func()はまた別のスレッド(スレッドB)で実行します。 「処理1」, 「処理2」は毎回実行。My_Func()は処理が終わるまで新しく実行しない。 自分で考えたのが、スレッドBの同時実行回数を制限すればいいのかなと思ったのですが、そのやり方が分かりません。 どこを修正、追加したらいいでしょうか。 よろしくお願いいたします。 追記 実現実行順序は 以下をループ ↓ My_Func()が実行中ではなかったら My_Func()を別スレッドで実行。 ↓ 処理1 ↓ 処理2 → → → ↑ 実行結果は 1 処理1 処理2 処理1 処理2 処理1 処理2 処理1 処理2 99999 ← ここの数字はなんでもいい 処理1 処理2 処理1 処理2 処理1 処理2 処理1 処理2 99999 ← ここの数字はなんでもいい こうなってほしいです。 説明が下手ですみません。
回答: ``` private void button1_Click(object sender, EventArgs e) { int iIdx = 0; Task.Run(async () => { for (;;) { iIdx++; await My_Func(iIdx); Console.WriteLine("処理1"); Console.WriteLine("処理2"); await Task.Delay(10); } }); } SemaphoreSlim semaphore = new SemaphoreSlim(0, 1); async Task My_Func(int iIdx) { if (await semaphore.WaitAsync(0)) { Console.WriteLine(iIdx.ToString()); await Task.Delay(20000); semaphore.Release(); } } ``` こんな感じか。 どうやって止めるのだろう?とか素朴な疑問はあるけど。 追記 == SemaphoreSlim を使えば解決じゃないかな SemaphoreSlim を使って並列実行を制御する