我正在學習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鏈接的例子中,他們都使用任務。沒有理由認爲吃麪包比吃米飯更好! –