Semaphore Wait vs WaitAsync in an async method

試著忘記壹切 提交于 2020-05-10 04:26:05

问题


I'm trying to find out what is the difference between the SemaphoreSlim use of Wait and WaitAsync, used in this kind of context:

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;
}

回答1:


If you have async method - you want to avoid any blocking calls if possible. SemaphoreSlim.Wait() is a blocking call. So what will happen if you use Wait() and semaphore is not available at the moment? It will block the caller, which is very unexpected thing for async methods:

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

If you use WaitAsync - it will not block the caller if semaphore is not available at the moment.

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

Also you should beware to use regular locking mechanisms together with async\await. After doing this:

result = await this.GetStringAsync();

You may be on another thread after await, which means when you try to release the lock you acquired - it might fail, because you are trying to release it not from the same thread you acquired it. Note this is NOT the case for semaphore, because it does not have thread affinity (unlike other such constructs like Monitor.Enter, ReaderWriterLock and so on).




回答2:


The difference is that Wait blocks the current thread until semaphore is released, while WaitAsync does not.



来源:https://stackoverflow.com/questions/44305825/semaphore-wait-vs-waitasync-in-an-async-method

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!