【发布时间】:2020-05-08 20:12:12
【问题描述】:
我的程序中有一个异步方法。我需要任务是异步的,因为它会发出网络请求,但我不希望它是可重入的。换句话说,如果在第一次调用返回之前从代码块 A 调用该方法,然后再从代码块 B 调用该方法,我希望第二次调用等到第一次调用完成后再运行。
如果该方法不是异步方法,我可以使用以下注释来完成它: [MethodImpl(MethodImplOptions.Synchronized)]
但是,编译器不允许将注解附加到异步方法。
我还能做什么?
【问题讨论】:
-
你可以G。使用
SemaphoreSlim之类的东西一次只让一个线程进入方法。 -
Synchronized只是一个隐含的lock,虽然你不能在async方法中使用lock,但确实存在SemaphoreSlim和AsyncLock之类的东西来实现相互以异步方式排除。顺便说一句,即使在同步代码中也不要使用Synchronized——它基本上就在那里,因为 Java 有它,但它所隐含的lock (this)比锁定为此目的明确声明的私有字段要糟糕得多。
标签: c# .net uwp async-await