【发布时间】:2016-11-02 14:25:14
【问题描述】:
我想知道这个任务是否有更好的解决方案。一个有一个由一定数量的线程并发调用的函数,但是如果某个线程已经在执行代码,则其他线程应该跳过该部分代码并等待该线程完成执行。这是我现在所拥有的:
int _flag = 0;
readonly ManualResetEventSlim Mre = new ManualResetEventSlim();
void Foo()
{
if (Interlocked.CompareExchange(ref _flag, 1, 0) == 0)
{
Mre.Reset();
try
{
// do stuff
}
finally
{
Mre.Set();
Interlocked.Exchange(ref _flag, 0);
}
}
else
{
Mre.Wait();
}
}
我想要实现的是更快的执行速度、更低的开销和更漂亮的外观。
【问题讨论】:
-
我很好奇,你有什么场景对方法结束时的 Wait() 有用?换句话说,为什么那个线程会等待?
-
该方法实际上做了什么?您可以使用
ActionBlock<T>将类型 T 的消息逐个排队以供执行。或者TransformBlock<T1,T2>一次处理一个输入并将输出发送到后续块 -
处理并发问题的最佳方法是完全避免使用原始线程。 .NET 已经包含实现大多数并发方案的类。大多数情况下,您最终会实现 BCL 中已有的内容
-
@Dragos 例如,我有一个过期超时的缓存。当有人试图与缓存交互时,过期的项目会被删除,但只有一个线程应该处理它们,其他线程应该等到它结束。
-
@ilivit 如果其他线程通过像IReadDictionary<TKey,TValue> 这样的只读接口访问缓存,这将容易得多。
Dictionary<>和ConcurrentDictionary<>都实现了这个接口
标签: c# .net multithreading concurrency manualresetevent