将List <t>转换为BlockingCollection <t>

时间:2016-05-04 02:20:50

标签: c#

我试图将List<T>转换为BlockingCollection<T>,这是我的代码..

List<Job> jobs = new List<Job>
    {
        new Job() {Id=Guid.NewGuid(), Name="test1" },
        new Job() {Id=Guid.NewGuid(), Name="test2" },
        new Job() {Id=Guid.NewGuid(), Name="test3" },
    };

BlockingCollection<Job> coll = jobs as BlockingCollection<Job>;

并且Job类被定义为..

public class Job
{
    public Guid Id { get; set; }
    public string Name { get; set; }
}

这种类型的铸造似乎不起作用。有没有更简单,更高效的方法将List<T>转换为BlockingCollection<T>而不循环遍历列表并明确地将每个列表项添加到集合中?

1 个答案:

答案 0 :(得分:11)

BlockingCollection<T>提供了一个接受IProducerConsumerCollection<T>的构造函数。因此,您可以利用具有高效IProducerConsumerCollection<T>复制机制的IEnumerable<T>实施,例如ConcurrentQueue<T>

List<Job> jobs = new List<Job> {
    new Job { Id = Guid.NewGuid(), Name = "test1" },
    new Job { Id = Guid.NewGuid(), Name = "test2" },
    new Job { Id = Guid.NewGuid(), Name = "test3" },
};

BlockingCollection<Job> col = new BlockingCollection<Job>(new ConcurrentQueue<Job>(jobs));

这避免了与逐个添加项目相关联的(相当重要的)锁定开销。