我在Async / Await函数中有一部分代码,我只希望一次执行一个线程。
通过创建新的SemaphoreSlim(1)并使用WaitAsync / Release,这相对简单。结果是第一个线程执行而其他线程等待然后逐个执行。
我想要实现的目标实际上略有不同。我希望其他线程不要等待,但要退出该函数(即我不想阻止其他线程)。所以,如果有一个属性" NumberOfThreadsCurrentlyExecuting"我实际上会有一个If Semaphore.NumberOfThreadsCurrentlyExecuting> 0然后返回。
但这样的财产并不存在。有没有人想知道解决这个问题的方法?
由于 查尔斯
答案 0 :(得分:19)
Charles,如何使用SemaphoreSlim.Wait/Async
进行零超时?如果它无法进入信号量(因为它已经输入),它将返回false。
Monitor
(以及lock
)完全不适合async
(因此,您await
中无法lock
),因为
答案 1 :(得分:-2)
您可以使用Monitor
。
如果你致电TryEnter
但它失败了,另一个线程就在“锁定”中。
这是线程安全的(与检查信号量计数不同),非常简单:
//使用somethign如:object sync = new object();
bool lockTaken = Monitor.TryEnter(sync);
try
{
if (lockTaken)
{
// You're here - do your work
}
else
{
// Something else was in the thread - exit?
return;
}
}
finally
{
if (lockTaken) Monitor.Exit(sync);
}