同時に仕事をできる机(Task)の数を決めるのが、SemaphoreSlimです。
基本
//机を2つ用意SemaphoreSlimss=newSemaphoreSlim(2);//机が1つ埋まるss.Wait();//机がもう1つ埋まるss.Wait();//2つとも埋まった机のうち、1つだけ空けるss.Release(1);//空いてる机の数を確認Console.WriteLine(ss.CurrentCount);//実行結果は、1Waitで、机を使う。
Releaseで、机を空ける。
かんたんな例
usingSystem;usingSystem.Threading;usingSystem.Threading.Tasks;classProgram{staticvoidMain(string[]args){SemaphoreSlimss=newSemaphoreSlim(0);//最初は、机を1つも作らないss.Release(1);//机を1つだけ追加//机が1つしかないので、作業1だけが実行されるTasktask1=Task.Run(()=>{ss.Wait();Console.WriteLine("作業1");});Tasktask2=Task.Run(()=>{ss.Wait();Console.WriteLine("作業2");});//1つしかない机は、作業1で埋まっているので、0Console.WriteLine(ss.CurrentCount);Console.ReadLine();}}Taskを実行しようとしても、空いてる机の数しか実行されない
引数
SemaphoreSlimss=newSemaphoreSlim(1,6);第1引数は、机の数(後から追加できる)
第2引数は、机の最大数
机は1つしかないが、最大6つまで増やせられる。
Waitと、WaitAsyncの違い
usingSystem;usingSystem.Threading.Tasks;usingSystem.Threading;usingSystem.Collections.Generic;classProgram{staticvoidMain(string[]args){Sub();Console.WriteLine("main");//AConsole.ReadLine();}publicstaticasyncTaskSub(){SemaphoreSlimss=newSemaphoreSlim(2);List<Task>list=newList<Task>();intnum=10;while(num-->0){awaitss.WaitAsync();//B Aが先に実行される(非同期)//ss.Wait(); //C Aが後に実行される(同期)list.Add(Task.Run(()=>{Thread.Sleep(100);Console.WriteLine("-");ss.Release();}));}awaitTask.WhenAll(list);}}Waitは、呼び出し元を待機させ(同期)
WaitAsyncは、待機させません(非同期)
Waitメソッドは入れたらTrueを返します。
既に満席で入れなかったらFalseを返します。
キャンセル
CancellationToken はまず CancellationTokenSource を生成した上で、
CancellationTokenSource.Token より取得します。
キャンセルを要求するには CancellationTokenSource.Cancel() を呼びます。
つづく・・・