如果我想把有await 语句的代码块给锁起来应该怎么办?
lock 是不允许的。
试试信号量:
static SemaphoreSlim semaphoreSlim = new SemaphoreSlim(1,1);
// .....
await semaphoreSlim.WaitAsync();
try
{
await Task.Delay(1000);
}
finally
{
semaphoreSlim.Release();
}
楼上正解。
那用Monitor.Enter/Monitor.Exit代替试试
lock 是 Monitor.Enter/Monitor.Exit 的语法糖
@不如隐茶去: 我知道lock 是 Monitor.Enter/Monitor.Exit 的语法糖,这个跟信号量那个写法儿上没有任何区别,你都没试一下吧
@jello chen: 试了,报错如下:
Unhandled Exception: System.Threading.SynchronizationLockException: Object synchronization method was called from an unsynchronized block of code.
at System.Threading.Monitor.Exit(Object obj)
at Test.Program.Test() in /private/tmp/Test/Program.cs:line 16
at Test.Program.Main(String[] args) in /private/tmp/Test/Program.cs:line 20
at Test.Program.<Main>(String[] args)