В основе проблемы лежит чтение данных из потока (привязка к вводу-выводу), обработка данных (привязка к ЦП), а затем запись в другой поток (привязка к вводу-выводу).
Наивный способ похож на это
thread 1: loop { |<--read data block from stream-->|<--process data block-->|<--write to stream-->| }
Наивный шаблон производитель-потребитель
thread 1: loop { |<--read data block from stream-->| enqueue data block to blocking queue A }
thread 2: loop { dequeue data block from blocking queue A |<--process data block-->| enqueue data block to blocking queue B }
thread 3: loop { dequeue data block from blocking queue B |<--write to stream-->| }
Пример потока выглядит следующим образом:
var hasher = MD5.Create();
using (FileStream readStream = new FileStream("filePath", FileMode.Open))
using (BufferedStream readBs = new BufferedStream(readStream ))
using (CryptoStream md5HashStream = new CryptoStream(readBs, hasher, CryptoStreamMode.Read))
using (FileStream writeStream= File.OpenWrite("destPath"))
using (BufferedStream writeBs = new BufferedStream(writeStream))
{
md5HashStream.CopyTo(writeBs);
}
Как использовать C# asyn c такие трюки, как asyn c stream, channel, dataflow, чтобы преобразовать приведенный выше образец потока в шаблон производитель-покупатель, чтобы сократить время блокировки io?