간단한 "SemaphoreSlim"사용 방법

8776 단어 taskC#SemaphoreSlim
동시에 일할 수 있는 책상Task의 수량은 SemaphoreSlim이다.

기본적
//机を2つ用意
SemaphoreSlim ss = new SemaphoreSlim(2);

//机が1つ埋まる
ss.Wait();

//机がさらに1つ埋まる
ss.Wait();

//2つとも埋まった机のうち、1つだけ空ける
ss.Release(1);

//空いてる机の数を確認
Console.WriteLine(ss.CurrentCount);
//実行結果は、1
Wait 책상을 사용합니다.Release 빈 테이블을 사용하거나 새 테이블을 준비하세요.CurrentCount 테이블 수량 확인
간단한 예
using System;
using System.Threading;
using System.Threading.Tasks;

class Program {
    static void Main(string[] args) {

        SemaphoreSlim ss = new SemaphoreSlim(0);    //最初は、机を1つも作らない
        ss.Release(1);      //机を1つだけ追加

        //机が1つしかないので、作業1だけが実行される
        Task task1 = Task.Run(() =>{ss.Wait();  Console.WriteLine("作業1");});
        Task task2 = Task.Run(() =>{ss.Wait();  Console.WriteLine("作業2");});

        //1つしかない机は、作業1で埋まっているので、0
        Console.WriteLine(  ss.CurrentCount);

        Console.ReadLine();
    }
}
Task 를 실행하고 싶어도 빈 테이블 수만 실행
매개 변수
SemaphoreSlim ss = new SemaphoreSlim(1, 6); 
첫 번째 파라미터는 테이블의 수량입니다 (이후 추가 가능)
두 번째 파라미터는 책상의 최대 수이다
책상은 한 개뿐이니 최대 여섯 개까지 늘릴 수 있다.
SemaphoreSlim ss = new SemaphoreSlim(1); 
매개 변수는 테이블의 수량입니다. (최대 수량은 설정되지 않았습니다. 이후에 많이 추가할 수 있습니다.)
Wait과 WaitAsync의 차이점
using System;
using System.Threading.Tasks;
using System.Threading;
using System.Collections.Generic;

class Program {
    static void Main(string[] args) {
        Sub();
        Console.WriteLine("main");      //A
        Console.ReadLine();
    }
    public static async Task Sub() {
        SemaphoreSlim ss = new SemaphoreSlim(2);
        List<Task> list = new List<Task>();
        int num = 10;

        while(num-- > 0) {
            await ss.WaitAsync();       //B     Aが先に実行される(非同期)
            //ss.Wait();                //C     Aが後に実行される(同期)

            list.Add(   Task.Run(   () => {
                Thread.Sleep(100);
                Console.WriteLine("-");
                ss.Release();
            }));
        }
        await Task.WhenAll(list);
    }
}
Wait 호출자 대기(동기화)
비동기식 Waitasync
Wait 메서드를 입력한 후 True로 돌아갑니다.
만약 이미 꽉 차서 들어가지 않았다면, 나는 너에게 false를 돌려줄 것이다.
취소
CancellationToken은 CancellationToken Source를 생성한 다음에.
CancellationTokenSource.Token에서 얻습니다.
CancellationTokenSource 요청을 취소합니다.저는 Cancel()이라고 합니다.
계속하다

좋은 웹페이지 즐겨찾기