2017-06-01 29 views
4

に、私はこの種のコンテキストで使用される、待ちとWaitAsyncのSemaphoreSlim使用の違いが何であるかを見つけようとしているWaitAsync対待っ:セマフォ非同期メソッド

private SemaphoreSlim semaphore = new SemaphoreSlim(1); 
public async Task<string> Get() 
{ 
    // What's the difference between using Wait and WaitAsync here? 
    this.semaphore.Wait(); // await this.semaphore.WaitAsync() 

    string result; 
    try { 
    result = this.GetStringAsync(); 
    } 
    finally { 
    this.semaphore.Release(); 
    } 

    return result; 
} 
+2

他のほとんどの 'XXX'メソッドと' XXXAsync'メソッドの違いは、1つはブロックし、もう1つはスレッドを生成します。 –

答えて

7

非同期方式を使用している場合は、できるだけブロッキングコールを避ける必要があります。 SemaphoreSlim.Wait()はブロッキングコールです。したがって、Wait()を使用し、現在セマフォが利用できない場合はどうなりますか?セマフォは、現時点では利用できない場合、それは、呼び出し元をブロックすることはありません - あなたはWaitAsyncを使用している場合

// this will _block_ despite calling async method and using await 
// until semaphore is available 
var myTask = Get(); 
var myString = await Get(); // will block also 

:それは非同期メソッドのための非常に予想外のものである発信者を、ブロックします。

var myTask = Get(); 
// can continue with other things, even if semaphore is not available 

また、async \ awaitと一緒に通常のロックメカニズムを使用することに注意してください。これを実行した後:

result = await this.GetStringAsync(); 
あなたは、あなたが取得したロック解除しようとする意味 await後に別のスレッド、上にあってもよい

- あなたが取得し、同じスレッドからではない、それを解放しようとしているので、それが失敗する可能性がありますがそれ。これは、Monitor.Enter,ReaderWriterLockのような他の構造体とは異なり、スレッド類似性を持たないため、NOTセマフォの場合です。

+1

セマフォはスレッドアファインではないため、どのスレッドからも取得/解放できます。しかし、他のロック機構はスレッドアファインである。 –

3

違いは、Waitですsemaphoreが解放されるまで現在のスレッドをブロックしますが、WaitAsyncはスレッドをブロックしません。

関連する問題