Tom*_*ski 1 c# asynchronous async-await
methodX()这两个片段中的执行是否不同?
SemaphoreSlim _locker、.Wait()、 和WaitAsync()是具有同步和异步版本的同一方法的示例:
A:
SemaphoreSlim _locker = new SemaphoreSlim(1);
async Task methodX()
{
_locker.Wait();
// .. rest of the code
}
Run Code Online (Sandbox Code Playgroud)
乙:
SemaphoreSlim _locker = new SemaphoreSlim(1);
async Task methodX()
{
await _locker.WaitAsync();
// .. rest of the code
}
Run Code Online (Sandbox Code Playgroud)
Mar*_*ell 14
有趣的问题是,如果我们不能立即获取锁会发生什么?
对于第一个代码示例,当前线程将阻塞,并在获取锁时解除阻塞以继续,无需线程转换即可继续。
对于第二个代码示例,await将检测不完整状态,并使用状态机附加操作完成时发生的延续,然后展开自身。假设 unroll 到达了驱动线程的任何地方(通常是线程池),那么该线程就可以被重用来执行其他 CPU 工作。在将来的某个时刻,将触发延续并重新激活工作,很可能在不同的线程上(同步上下文可能意味着使用相同的线程,特别是在 WinForms 等 UI 环境中)。
这种延续机制有一些(小的)开销——没有什么是免费的,但这意味着你不应该耗尽线程;因此,await对于防止高并发服务器上的所有线程处于空闲状态、等待 IO、锁获取等操作非常有用,这样仍然可以完成一些有用的工作。
| 归档时间: |
|
| 查看次数: |
150 次 |
| 最近记录: |