Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9703

かんたんな「SemaphoreSlim」の使い方

$
0
0

同時に仕事をできる机(Task)の数を決めるのが、SemaphoreSlimです。
company_syokuba_kengak:relaxed:u_business.png

基本

//机を2つ用意SemaphoreSlimss=newSemaphoreSlim(2);//机が1つ埋まるss.Wait();//机がもう1つ埋まるss.Wait();//2つとも埋まった机のうち、1つだけ空けるss.Release(1);//空いてる机の数を確認Console.WriteLine(ss.CurrentCount);//実行結果は、1

Waitで、机を使う。
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() を呼びます。

つづく・・・


Viewing all articles
Browse latest Browse all 9703

Trending Articles