0

我使用任务并行库,我需要同步对方法的访问,但由于任务不一定为异步操作创建线程,所以我不能依赖使用锁。

void Foo()
{
    lock(SyncRoot)
    {
        // Do stuff...
    }
}

如果我想防止多个任务同时调用 Foo,我可以使用什么来代替锁定?我需要我的任务一一调用 Foo。


  • ContinueWith 不是一个选项。
  • 我使用.NET 4。
4

2 回答 2

6

来自MSDN

在幕后,任务排队到线程池,该线程池已通过算法(如爬山)进行了增强,该算法可确定并调整线程数以最大限度地提高吞吐量。

因此,您可以锁定或任何其他线程同步机制,如 ManualResetEvent 或内存屏障。

于 2012-07-10T15:27:07.987 回答
2

正如其他答案中所述,您可以使用已有的工具做您想做的事情,这由线程池为您处理。但是,如果您设置了不同的方法,您是否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.
    }
}

我希望这有帮助。

于 2012-07-10T15:26:58.903 回答