- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
Lucian 在这里讨论了一种模式 ( Tip 3: Wrap events up in Task-returning APIs and await them )。
我正在尝试在一个经常调用的方法上实现它,该方法看起来类似于下面的人为代码:
public Task BlackBoxAsync()
{
var tcs = new TaskCompletionSource<Object>(); // new'ed up every call
ThreadPool.QueueUserWorkItem(_ =>
{
try
{
DoSomethingStuff();
tcs.SetResult(null);
}
catch(Exception exc) { tcs.SetException(exc); }
});
return tcs.Task;
}
我担心性能,当TaskCompletionSource
每次调用都会更新(假设我每 100 毫秒调用一次此方法)。
我当时正在考虑使用 BufferBlock<T>
相反,认为它不会在每次通话时都更新。所以它看起来像:
private readonly BufferBlock<object> signalDone; // dummy class-level variable, new'ed up once in CTOR
public Task BlackBoxAsync()
{
ThreadPool.QueueUserWorkItem(_ =>
{
try
{
DoSomethingStuff();
signalDone.Post(null);
}
catch(Exception exc) { }
});
return signalDone.ReceiveAsync();
}
调用对象会这样调用它:
for (var i=0; i<10000; i++) {
await BlackBoxAsync().ConfigureAwait(false);
}
有人对使用 BufferBlock<T>
有任何想法吗?相反?
最佳答案
无论您采用何种解决方案,如果您想在每次调用此方法时都await
一个任务,那么创建一个新的Task
是不可避免的,因为任务是不可重复使用。最简单的方法是使用 TaskCompletionSource
。
因此,在我看来,第一个选项优于使用 BufferBlock
(不出所料,creates a new TaskCompletionSource
on ReceiveAsync
)
更重要的是,您的代码似乎只是将工作卸载到 ThreadPool
并返回代表该工作的任务。为什么不使用简单的 Task.Run
?
public Task BlackBoxAsync()
{
return Task.Run(() => DoSomethingStuff());
}
关于c# - 使用 TaskCompletionSource 与 BufferBlock<T> 包装事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30694356/
我有一个数据流如下。 1. 以 block 的形式读取文本文件并将它们添加到 BatchBlock 的任务 2.一个ActionBlock链接到上面的 BatchBlock将数据分成批处理并将它们添加
我有一个相当简单的生产者-消费者模式,其中(简化)我有两个生产者,他们生产由一个消费者消费的输出。 为此,我使用 System.Threading.Tasks.Dataflow.BufferBlock
我有一些关于 Bufferblock 和 Dataflow 处理的问题一般的。假设我有一个类似下面的设置(我从另一个问题复制此代码,但它用于说明) var forwarder = new Buffer
我最近开始使用 .NET 4.5 中的 TPL 数据流库, block 的整个概念对我来说都是全新的。我在我的应用程序中实现了一个生产者-消费者队列,我需要防止将重复的消息放入队列中,因此需要检查消息
我想知道使用链接到一个或多个 ActionBlock 的 BufferBlock 是否有好处,除了节流(使用 BoundedCapacity),而不是直接发布到 ActionBlock(只要不需要节流
我不确定这是否可行,但如果可行,我可能做得不对。假设我有一个链接到许多消费者(ActionBlocks)的共享缓冲区。每个消费者都应该消费满足用于将其链接到缓冲区的谓词的数据。例如,ActionBlo
我正在学习 TPL Dataflow 库。到目前为止,这正是我所寻找的。 我创建了一个简单的类(如下),它执行以下功能 执行 ImportPropertiesForBranch 后,我会转到第 3 方
拥有它应该是很自然的事情,我想知道是否有来自 TPL DataFlow 库的优先级缓冲区块的现成实现? 最佳答案 似乎实现这一目标的最佳方法是使用专门的 任务调度器 ,而不是实现您自己的 Buffer
BufferBlock是一个非常好的队列异步接口(interface)。 我正在寻找的是类似的东西,但用于后进先出堆栈。我正在寻找 BlockingCollection 的等效功能当通过 Concur
我有一个简单的生产者-消费者类,它使用 BufferBlock 对象来发布改编自 TPL Dataflow Docs 的消息。我的问题是,在 WPF 应用程序中使用它会导致消费者在同一主线程中接收数据
假设我有一个简单的 ActionBlock var actionBlock = new ActionBlock(_ => Console.WriteLine(_)); 我可以指定一个有限的容量来启用缓
Lucian 在这里讨论了一种模式 ( Tip 3: Wrap events up in Task-returning APIs and await them )。 我正在尝试在一个经常调用的方法上实
在处理 an answer 时至 this question ,我写了这个片段: var buffer = new BufferBlock(); var producer = Task.Run(asy
如果使用默认构造函数构造 TPL BufferBlock,DataFlowBlockOptions 是否无界?换句话说,BufferBlock 的BoundedCapacity 是多少? As sta
我最近将我的 LogManager 类从 static 转换为 singleton 类,以便在 WPF 中更容易绑定(bind)(虽然我认为这个问题也存在在这之前)。在检查了所有是否一切正常之后,我发
交叉发布到 http://social.msdn.microsoft.com/Forums/en-US/tpldataflow/thread/89b3f71d-3777-4fad-9c11-50d8d
我有这个代码: var data = new BufferBlock(new DataflowBlockOptions { BoundedCapacity = 1 }); var action = n
我是一名优秀的程序员,十分优秀!