并发队列出列

时间:2017-02-09 19:00:42

标签: c# multithreading delegates concurrent-queue

我正在使用并发队列,并通过创建Action委托

通过多个线程将队列中的数据出队
Action action = () =>
        {
            SubscriptionResponseModel subsModel;
            while (concurrentQueue.TryTake(out subsModel))
            {
                MakeTransactionAndAddIntoQueue(subsModel);
            }
        };

并调用此操作委托并行多线程

Parallel.Invoke(action, action, action, action, action, action, action, action, action, action, action, action, action, action, action);

当我在多个操作中使用SubscriptionResponseModel subsModel;时,我想知道一件事是线程安全吗?

1 个答案:

答案 0 :(得分:1)

action的每次调用都有自己的subsModel - 因此使用它从队列中获取值是线程安全的。

当它从外部上下文中捕获变量时,它不是线程安全的情况:

    // ********** Code showing non-thread safe case **************
    SubscriptionResponseModel subsModel;
    Action action = () =>
    {
        // all invocations of `action` will share subsModel as it is captured.
        while (concurrentQueue.TryDequeue(out subsModel))
        {
            MakeTransactionAndAddIntoQueue(subsModel);
        }
    };

注意:

  • 使用SubscriptionResponseModel的属性/方法是否是线程安全取决于该类型。
  • 很有可能并行运行多个TryDequeue根本不会提高性能。多个繁忙循环的Parallel.Invoke将只阻止多个线程不断查询空队列。