ruf*_*ufo 22 c# multithreading
我不清楚(并且找不到足够明确的文档):在异步方法中使用lock关键字时:如果对象已经被阻塞,线程是否会被阻塞,或者它是否会在挂起状态下返回任务(不阻塞线程) ,并在释放锁时返回)?
在下面的代码中,行会阻塞线程吗?如果它阻塞线程(这是我的想法),是否有标准的阻塞解决方案?我正在考虑使用AsyncLock,但首先我想尝试标准的东西.
谢谢.
private object myLock = new object();
private async Task MyMethod1(){
lock (myLock ) {// <---- will this line cause a return of the current method as an Await method call would do if myLock was already locked.
....
}
}
// other methods that lock on myLock
Run Code Online (Sandbox Code Playgroud)
Ste*_*ary 42
在下面的代码中,行会阻塞线程吗?
从技术上讲,是的,但它不会像你期望的那样工作.
线程仿射锁不能很好地使用有两个原因async
.一个是(在一般情况下),一个async
方法可能无法在同一个线程上恢复,因此它会尝试释放它不拥有的锁,而另一个线程永远持有锁.另一个原因是,在一段await
时间内持有锁,在锁定时可以执行任意代码.
出于这个原因,编译器不遗余力地禁止块await
内的表达式lock
.不过,你仍然可以通过Monitor
直接使用或其他原语射击自己.
如果它阻塞线程(这是我的想法),是否有标准的阻塞解决方案?
是; 该SemaphoreSlim
类型支持WaitAsync
.
use*_*220 14
这是不允许停止僵局(即开发人员伤害自己).我发现的最佳解决方案是使用semaphones - 有关详细信息,请参阅此帖子:
https://blog.cdemi.io/async-waiting-inside-c-sharp-locks/
相关代码提取:
static SemaphoreSlim semaphoreSlim = new SemaphoreSlim(1, 1);
...
await semaphoreSlim.WaitAsync();
try
{
await Task.Delay(1000);
}
finally
{
semaphoreSlim.Release();
}
Run Code Online (Sandbox Code Playgroud)