Ejemplo n.º 1
0
        private static ByteTable CountProducerConsumer(string fileName)
        {
            var queue = new BlockingCollection <byte[]>(100);

            var producer = new Thread(() => {
                foreach (var chunk in ReadFileChunks(fileName))
                {
                    queue.Add(chunk);
                }
                queue.Add(null);
            });

            var table = new ByteTable();

            var consumer = new Thread(() => {
                while (true)
                {
                    var buffer = queue.Take();
                    if (buffer == null)
                    {
                        return;
                    }
                    table.add(buffer.CountBytes());
                }
            });

            producer.Start();
            consumer.Start();

            producer.Join();
            consumer.Join();

            return(table);
        }
Ejemplo n.º 2
0
        private static ByteTable CountProducerNConsumers(string fileName, int n)
        {
            var queue = new BlockingCollection <byte[]>(100);

            var producer = new Thread(() => {
                foreach (var chunk in ReadFileChunks(fileName))
                {
                    queue.Add(chunk);
                }
            });

            var table = new ByteTable();

            var consumers = Enumerable.Range(0, n).Select(_ => {
                return(new Thread(() => {
                    while (true)
                    {
                        var buffer = queue.Take();
                        if (buffer == null)
                        {
                            return;
                        }
                        var count = buffer.CountBytes();

                        lock (table)
                        {
                            table.add(count);
                        }
                    }
                }));
            }).ToArray();


            producer.Start();
            foreach (var c in consumers)
            {
                c.Start();
            }

            producer.Join();

            foreach (var c in consumers)
            {
                queue.Add(null);
            }
            foreach (var c in consumers)
            {
                c.Join();
            }

            return(table);
        }