Я изучаю поток данных TPL, я видел, что это сила моих друзей, и я сталкиваюсь с проблемой с моей реализацией.Выполнение одного и того же ActionBlock несколько раз с неограниченным параллелизмом
Я хочу/нужно отправлять сообщения так быстро, как я могу. Я делаю некоторое прототипирования в LINQPad, и это то, что я до сих пор:
// Holds all the messages for my loadMessage ActionBlock to grab its data from
var bufferBlock = new BufferBlock<string>();
// Sends message to where it needs to go as fast as it can.
var loadMessage = new ActionBlock<string>(msg =>
{
msg.Dump();
},
new ExecutionDataflowBlockOptions
{
MaxDegreeOfParallelism = DataflowBlockOptions.Unbounded
});
// Links the blocks together
bufferBlock.LinkTo(loadMessage);
// Loads the Buffer
for (int i = 0; i < 10; i++)
{
bufferBlock.Post("This is a message");
}
//Calls completion to stop threads
bufferBlock.Complete();
loadMessage.Complete();
Проблема заключается в том, что loadMessageBlock не демпинг сообщения в приведенном выше примере. Я искал некоторую информацию с небольшой удачей. Я думаю, что у меня нет чего-то фундаментального для TPL. Я понимаю, что BufferBlock содержит информацию для обработки другими блоками, а ActionBlocked (которая связана с BufferBlock) должна захватывать данные из буфера и делать то, что нужно. После цикла For, который помещает информацию в буфер, завершается завершение завершения, чтобы остановить потоки.
В реализации у меня есть Параллель. Для этого выполняется код внутри моего loadMessage просто отлично. Я просто не могу реализовать TPL, чтобы делать то, что хочу, и я понимаю, что TPL будет быстрее, чем Parallel.For.
Неужели я здесь, как я думаю, это должно работать? Я неправильно использую TPL? Я собираюсь продолжить исследование для ответа, любые указатели будут высоко оценены. Благодаря!
Спасибо за помощь. Я не использовал TPL для этого конкретного случая, но я больше читаю о Task и Threading для будущих реализаций. – Schanckopotamus
Нет необходимости использовать «Задачу» для получения здесь, это именно то, для чего «ActionBlock». – svick
@svick Какой бы способ вы ни выбрали, и даже в примере на ссылке MSDN, которую я опубликовал, они использовали Task. Нет смысла утверждать, что есть хлеб лучше, чем есть рис! –