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相关问答推荐

我应该将新的httpReportMessage()包装在using声明中吗?

ß != ss与ICU进行不区分大小写的比较

CsWin32如何创建PWSTR的实例,例如GetWindowText

通过EFCore上传大量数据.

如何在Visual Studio代码中更改大括号模式{},用于C#语言

与C#中的Zip列表并行

mocking对象的引发事件并作为用于调用方法的参数对象传递到那里

为什么在使用动态obj+类obj时会调用串联?

ASP.NET核心MVC SqlException:违反主键约束';PK_USER';.无法在对象';数据库中插入重复的密钥.用户';

C#-VS2022:全局使用和保存时的代码清理

try 使用C#ASP.NET收集WMI信息时访问被拒绝,但在PowerShell中工作

反序列化私有成员

如何在C#中将方法/线程启动传递给基本构造函数

net中从位图获取坐标和绘制折线

如何在用户在线时限制令牌生成?

对于PowerShell中的ConvertTo-SecureString方法,Microsoft如何将初始化向量添加到AES加密中的安全字符串?

岛屿和框架中的自定义控件库.Navigate-AccessViolationException

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

如何使用.NET 8.0中新的CompositeFormat类?

仅在Blazor Web App中覆盖生产的基本路径(.NET8中的_Hosts.cshtml文件功能?)