Does executions of methodX() in those two snippets are different ?
SemaphoreSlim _locker .Wait() & WaitAsync() is just as example of same method having sync and async version.

答:

SemaphoreSlim _locker = new SemaphoreSlim(1);
async Task methodX()
{
   _locker.Wait();
   // .. rest of the code
}

B:

SemaphoreSlim _locker = new SemaphoreSlim(1);
async Task methodX()
{
   await _locker.WaitAsync();
   // .. rest of the code
}

推荐答案

有趣的问题是what happens if we can't acquire the lock immediately?

在第一个代码样例中,当前线程将被阻塞,并将在锁被获取时被解除阻塞以继续,继续而不进行线程转换.

对于第二个代码样例,await将检测不完整状态,并使用状态机附加在操作完成时发生的延续,然后是unroll itself.假设展开到驱动线程(通常是线程池)的任何东西,然后可以重用该线程来执行其他CPU工作.在将来的某个时刻,继续将被触发并且工作将重新激活,quite possibly on a different thread(同步上下文可能意味着使用相同的线程,特别是在像WinForms这样的UI环境中).

这种延续机制有一些(小的)开销-没有什么是免费的,但它意味着你不应该用完线程;因此,await对于防止高并发服务器上的所有线程空闲,等待IO,锁获取等-仍然可以做一些有用的工作是非常有用的.

Csharp相关问答推荐

有没有办法把+02:00转换成TimeSpan?""

将委托传递到serviceccollection c#web API

TDLib与机器人共享电话号码

MudBlazor—MudDataGrid—默认过滤器定义不允许用户修改基本过滤器

在实时数据库中匹配两个玩家的问题

静态对象构造顺序

无法通过绑定禁用条目

在EF Core中,有没有什么方法可以防止在查询中写入相同的条件,而代之以表达式?

在C#中,将两个哈希集连接在一起的时间复杂度是多少?

BlockingCollection T引发意外InvalidOperationException

当我没有此令牌时,为什么语法报告EOF错误?

异步等待Foreach循环中的ConfigureAWait(FALSE)执行什么操作?

C#按名称从类获取属性值类型<;t>;,我需要反射吗?

如何将%{v_扩展}转换为%{v_扩展}>>

Blazor Server/.NET 8/在初始加载时调用异步代码是否冻结屏幕,直到第一次异步调用完成?

C#命名管道-编码错误?

RavenDb:为什么在字符串==空的情况下过滤会过滤得太多?

读取测试项目中的应用程序设置

微服务之间的通信是使用API调用还是仅使用Message Broker?

docker-compose拒绝连接到同一网络中的其他容器