我使用任务并行库,我需要同步对方法的访问,但由于任务不一定为异步操作创建线程,所以我不能依赖使用锁。
void Foo()
{
lock(SyncRoot)
{
// Do stuff...
}
}
如果我想防止多个任务同时调用 Foo,我可以使用什么来代替锁定?我需要我的任务一一调用 Foo。
- ContinueWith 不是一个选项。
- 我使用.NET 4。
我使用任务并行库,我需要同步对方法的访问,但由于任务不一定为异步操作创建线程,所以我不能依赖使用锁。
void Foo()
{
lock(SyncRoot)
{
// Do stuff...
}
}
如果我想防止多个任务同时调用 Foo,我可以使用什么来代替锁定?我需要我的任务一一调用 Foo。
来自MSDN:
在幕后,任务排队到线程池,该线程池已通过算法(如爬山)进行了增强,该算法可确定并调整线程数以最大限度地提高吞吐量。
因此,您可以锁定或任何其他线程同步机制,如 ManualResetEvent 或内存屏障。
正如其他答案中所述,您可以使用已有的工具做您想做的事情,这由线程池为您处理。但是,如果您设置了不同的方法,您是否ConcurrentCollection
专门查看了一个BlockingCollection
可用于创建执行您想要的生产者/消费者队列的方法,类似以下内容可能对您有用
public class TaskQueue : IDisposable
{
BlockingCollection<Action> taskX = new BlockingCollection<Action>();
public TaskQueue(int taskCount)
{
// Create and start new Task for each consumer.
for (int i = 0; i < taskCount; i++)
Task.Factory.StartNew(Consumer);
}
public void Dispose() { taskX.CompleteAdding(); }
public void EnqueueTask (Action action) { taskX.Add(Action); }
void Consumer()
{
// This seq. that we are enumerating will BLOCK when no elements
// are avalible and will end when CompleteAdding is called.
foreach (Action action in taskX.GetConsumingEnumerable())
action(); // Perform your task.
}
}
我希望这有帮助。