【发布时间】:2014-05-08 08:57:38
【问题描述】:
我是任务、并行和调度等方面的新手。在这里我创建了两个阻塞集合。一个用于收集输入,另一个用于输出。我添加了 100 个项目。所以我认为它们的总数应该是100或0。或者它们的总和等于100。
但是我发现它们都是0。请帮助我用简单的语言理解这些概念。
static void Main(string[] args)
{
new Program().run();
}
void run()
{
int threadCount = 4;
Task[] workers = new Task[threadCount];
Task.Factory.StartNew(consumer);
// We can do other work in parallel
for (int i = 0; i < threadCount; ++i)
{
int workerId = i;
Task task = new Task(() => worker(workerId));
workers[i] = task;
task.Start();
}
for (int i = 0; i < 100; ++i)
{
Console.WriteLine("Queueing work item {0}", i);
inputQueue.Add(i);
Thread.Sleep(50);
}
Console.WriteLine("Stopping adding.");
inputQueue.CompleteAdding();
Console.WriteLine("The count in InputQueue= {0}", inputQueue.Count);// 0
Task.WaitAll(workers);
outputQueue.CompleteAdding();
Console.WriteLine("The count in OutputQueue= {0}", outputQueue.Count); // 0
Console.WriteLine("Done.");
Console.ReadLine();
}
void worker(int workerId)
{
Console.WriteLine("Worker {0} is starting.", workerId);
foreach (var workItem in inputQueue.GetConsumingEnumerable())
{
Console.WriteLine("Worker {0} is processing item {1}", workerId, workItem);
Thread.Sleep(100); // Simulate work.
outputQueue.Add(workItem); // Output completed item.
}
Console.WriteLine("Worker {0} is stopping.", workerId);
}
void consumer()
{
Console.WriteLine("Consumer is starting.");
foreach (var workItem in outputQueue.GetConsumingEnumerable())
{
Console.WriteLine("Consumer is using item {0}", workItem);
Thread.Sleep(25);
}
Console.WriteLine("Consumer is finished.");
}
BlockingCollection<int> inputQueue = new BlockingCollection<int>();
BlockingCollection<int> outputQueue = new BlockingCollection<int>();
}
【问题讨论】:
标签: c# task-parallel-library scheduled-tasks