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
)因为
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)
归档时间: |
|
查看次数: |
2928 次 |
最近记录: |