我正在使用并发队列,并通过创建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;
时,我想知道一件事是线程安全吗?
答案 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
将只阻止多个线程不断查询空队列。