阻止收集的数据切换有时会花费太多时间......
示例代码:
制片人:
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毫秒的时间来传递数据。从理论上讲,消费者线程在写入时不应该阻塞,因为写入磁盘是在一个单独的线程上。
答案 0 :(得分:2)
这是你传递给构造函数的boundedCapacity值:
Blockingcollection<byte[]> collection =
new Blockingcollection (5000 /* <--- boundedCapacity */ );
您正在使用限制为5000个项目的队列初始化阻止集合。当队列中有5000个项目时,任何生产者都将被阻止,直到再次出现空槽。此限制可确保您的队列满足Little's Law。您需要分析系统以获得最佳边界值,或者您可以使队列无限制并编写一些单元测试以确保它不会溢出。