【发布时间】:2018-02-22 11:43:53
【问题描述】:
我有一个简单的生产者-消费者类,它使用 BufferBlock 对象发布改编自 TPL Dataflow Docs 的消息,我的问题是在 WPF 应用程序中使用它会导致消费者在同一个主线程中接收数据,而控制台应用程序在工作线程中执行它。这是我的代码:
public class DataflowProducerConsumer
{
BufferBlock<int> _buffer;
public DataflowProducerConsumer()
{
_buffer = new BufferBlock<int>();
var consumer = UseBufferBlock(_buffer);
}
public void Produce(int number)
{
_buffer.Post(number);
var actionBlock = UseActionBlock();
actionBlock.Post(number);
}
public async Task UseBufferBlock(ISourceBlock<int> source)
{
while (await source.OutputAvailableAsync())
{
int data = source.Receive();
// ...process data asyncron
Console.WriteLine("BufferBlock-Thread {0} received: {1}", Thread.CurrentThread.ManagedThreadId, data);
}
}
public ITargetBlock<int> UseActionBlock()
{
return new ActionBlock<int>(data =>
{
Console.WriteLine(string.Format("ActionBlock-Thread: {0} received: {1}", Thread.CurrentThread.ManagedThreadId, data));
});
}
}
在主事件或点击事件中执行的测试:
var obj = new DataflowProducerConsumer();
obj.Produce(19);
好吧,我将Post 更改为SendAsync 没有成功。 ActionBlock 部分运行良好。有什么不同?我做错了什么?
【问题讨论】:
-
你为什么不直接链接块?
标签: c# tpl-dataflow