我正在使用并发队列,并通过创建操作委托通过多个线程将数据从队列中取消排队
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
只会阻止多个线程不断查询空队列。