Kieren,
经过我的检查,我个人不知道有哪些线程安全类型适用于生产者消费者模式,可以完全满足您的要求。我不认为这是一种竞争性的解决方案,但建议您使用几个扩展方法来装饰BlockingCollection<T>
,这将使您能够提供任何内置或自定义类型,而不是默认的CancellationToken
。
阶段1:
以下是默认方法列表,它们使用底层的TryAddWithNoTimeValidation
方法将元素添加到队列中。
public void Add(T item){
this.TryAddWithNoTimeValidation(item, -1, new CancellationToken());
}
public void Add(T item, CancellationToken cancellationToken){
this.TryAddWithNoTimeValidation(item, -1, cancellationToken);
}
public bool TryAdd(T item){
return this.TryAddWithNoTimeValidation(item, 0, new CancellationToken());
}
public bool TryAdd(T item, TimeSpan timeout){
BlockingCollection<T>.ValidateTimeout(timeout);
return this.TryAddWithNoTimeValidation(item, (int) timeout.TotalMilliseconds, new CancellationToken());
}
public bool TryAdd(T item, int millisecondsTimeout){
BlockingCollection<T>.ValidateMillisecondsTimeout(millisecondsTimeout);
return this.TryAddWithNoTimeValidation(item, millisecondsTimeout, new CancellationToken());
}
public bool TryAdd(T item, int millisecondsTimeout, CancellationToken cancellationToken){
BlockingCollection<T>.ValidateMillisecondsTimeout(millisecondsTimeout);
return this.TryAddWithNoTimeValidation(item, millisecondsTimeout, cancellationToken);
}
现在您可以为您感兴趣的任何/所有方法提供扩展。
第二阶段:
现在您可以引用您实现的TryAddWithNoTimeValidation
而不是默认值。
我可以给您提供一个替代版本的TryAddWithNoTimeValidation
,它可以安全地继续执行而不会抛出OperationCancellation
异常。