首页 新闻 会员 周边 捐助

lock with async await

1
悬赏园豆:20 [已解决问题] 解决于 2019-02-15 16:49

如果我想把有await 语句的代码块给锁起来应该怎么办?

lock 是不允许的。

Shendu.CC的主页 Shendu.CC | 老鸟四级 | 园豆:2138
提问于:2019-02-15 09:59
< >
分享
最佳答案
0

试试信号量:

static SemaphoreSlim semaphoreSlim = new SemaphoreSlim(1,1);
// .....
await semaphoreSlim.WaitAsync();
try
{
    await Task.Delay(1000);
}
finally
{
    semaphoreSlim.Release();
}
收获园豆:20
不如隐茶去 | 小虾三级 |园豆:559 | 2019-02-15 16:43

楼上正解。

Shendu.CC | 园豆:2138 (老鸟四级) | 2019-02-15 16:49
其他回答(1)
0

那用Monitor.Enter/Monitor.Exit代替试试

jello chen | 园豆:7336 (大侠五级) | 2019-02-15 13:15

lock 是 Monitor.Enter/Monitor.Exit 的语法糖

支持(0) 反对(0) 不如隐茶去 | 园豆:559 (小虾三级) | 2019-02-15 16:45

@不如隐茶去: 我知道lock 是 Monitor.Enter/Monitor.Exit 的语法糖,这个跟信号量那个写法儿上没有任何区别,你都没试一下吧

支持(0) 反对(0) jello chen | 园豆:7336 (大侠五级) | 2019-02-15 21:23

@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)
支持(0) 反对(0) 不如隐茶去 | 园豆:559 (小虾三级) | 2019-02-15 23:40
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册