并发队列取消排队



我正在使用并发队列,并通过创建操作委托通过多个线程将数据从队列中取消排队

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;时一件事,它是线程安全的吗?

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只会阻止多个线程不断查询空队列。

相关内容

最新更新