跳过SemaphoreSlim而不是等待

时间:2014-08-13 22:03:16

标签: c# vb.net multithreading

我在Async / Await函数中有一部分代码,我只希望一次执行一个线程。

通过创建新的SemaphoreSlim(1)并使用WaitAsync / Release,这相对简单。结果是第一个线程执行而其他线程等待然后逐个执行。

我想要实现的目标实际上略有不同。我希望其他线程不要等待,但要退出该函数(即我不想阻止其他线程)。所以,如果有一个属性" NumberOfThreadsCurrentlyExecuting"我实际上会有一个If Semaphore.NumberOfThreadsCurrentlyExecuting> 0然后返回。

但这样的财产并不存在。有没有人想知道解决这个问题的方法?

由于 查尔斯

2 个答案:

答案 0 :(得分:19)

Charles,如何使用SemaphoreSlim.Wait/Async进行零超时?如果它无法进入信号量(因为它已经输入),它将返回false。

请注意,Monitor(以及lock)完全不适合async

(因此,您await中无法lock),因为

  1. 在您输入锁定后,您的任务可能会在另一个线程上继续(因此您将尝试从另一个线程释放锁定)
  2. 在你等待之后,另一个延续可能会使用你的线程(当它仍然持有锁)时,所以如果它试图获得锁定它将成功

答案 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);
}