我正在学习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循环之后,停止完成被调用以停止线程。
在实现中,我有一个Parallel.For,它运行我的loadMessage内的代码就好了。我只是不能实现TPL来做我想做的事情,我的理解是TPL将比Parallel.For更快。
我在这里如何认为这是假设工作?我错误地使用TPL吗?我将继续研究一个答案,任何指针将受到高度赞赏。谢谢!
感谢您的帮助。我没有最终使用TPL来处理这种特殊情况,但我正在阅读有关Task和Threading的更多信息以供将来实现。 – Schanckopotamus
这里没有必要使用'Task'接收,这正是'ActionBlock'的作用。 – svick
@svick无论你选择什么方式都很好,甚至在我发布的MSDN链接的例子中,他们都使用任务。没有理由认为吃面包比吃米饭更好! –