C#阻塞集合数据切换时间间歇

时间:2016-01-16 14:38:12

标签: c# multithreading asynchronous producer-consumer

阻止收集的数据切换有时会花费太多时间......

示例代码:
制片人:

Blockingcollection<byte[]> collection = new Blockingcollection (5000);
{
    while (condition)
    {
        byte[] data = new byte[10240]
        // fill data here.. Read from external source
        collection.add(data);
    }
collection.CompleteAdding();
}

消费者:

{
    while(!collection.IsCompleteAdding)
    {
        byte[] data = collection.Take();
        // write data to disk..
    }
}

生产者和消费者都在运行不同的任务。它运行得很完美,但有时候将数组添加到集合中需要大约50毫秒,这是一个交易破坏者,通常需要不到1毫秒的时间来传递数据。从理论上讲,消费者线程在写入时不应该阻塞,因为写入磁盘是在一个单独的线程上。

1 个答案:

答案 0 :(得分:2)

这是你传递给构造函数的boundedCapacity值:

Blockingcollection<byte[]> collection = 
    new Blockingcollection (5000 /* <--- boundedCapacity */ );

您正在使用限制为5000个项目的队列初始化阻止集合。当队列中有5000个项目时,任何生产者都将被阻止,直到再次出现空槽。此限制可确保您的队列满足Little's Law。您需要分析系统以获得最佳边界值,或者您可以使队列无限制并编写一些单元测试以确保它不会溢出。