跳过SemaphoreSlim而不是等待

Cha*_*les 7 c# vb.net multithreading

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

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

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

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

谢谢查尔斯

Mar*_*wul 25

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

注意Monitor(因此lock)完全不适合async

(因此,你不能await在a lock)因为

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

  • 零超时正是我所需要的!如果我的方法无法获得锁定/事件/任何东西,我希望我的方法立即退出...... (2认同)

Ree*_*sey -3

您可以只使用Monitor.

如果调用TryEnter失败,则另一个线程处于“锁”状态。

这是线程安全的(与检查信号量计数不同),并且相当简单:

// 使用类似的东西: objectsync = 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);
}
Run Code Online (Sandbox Code Playgroud)