【发布时间】:2014-10-27 16:26:03
【问题描述】:
我有一个第三方课程,我们称之为Analyser。这个类非常擅长分析,但实例化成本高(秒)且不支持多线程。
我的应用程序需要处理涉及调用Analyser 的请求。这些请求将同时发生。
我想我需要创建一个通用类,比如
public class Pool<T>
{
public Pool(Func<T> instantiator, int size)
{
...
}
public async Task<TResult> Invoke<TResult>(
Func<T, TResult> target,
CancellationToken cancellationToken)
{
// await the first available T,
// lock the T,
// invoke the target, return the result
// release the lock
}
}
这个类一般会封装池化功能。
我的问题是,实现这个类的正确方法是什么。它是否已经以不同的名称存在?我应该使用TPL.DataFlow 吗?我应该用手卷吗?
好被定义为可靠的线程安全,越容易维护越好。
如果通用 Pool 是解决问题的错误方法,请提出正确的替代方法。
Pool 类会像这样使用。
private readonly Pool<Analyser> pool = new Pool<Analyser>(
() => new Analyser(a, b, c),
100);
public async Task<string> ProcessRequest(
string raw,
CancellationToken cancellationToken)
{
return await this.pool.Invoke(
analyser => analyser.Analyse(raw),
cancellationToken);
}
【问题讨论】:
-
"await the first available T" 让我担心——如果它们都在使用中,并且都以某种方式请求 additional T这将永远不可用(因为拥有 T 的每个人都在等待 moar Tz)
-
@MarcGravell,如果将“重入”
target代表传递给Invoke,那将是一个明确的问题。 -
TPL.DataFlow (AFAIK) 涵盖了另一种问题......您有一个“流式”流程(例如,分析器将结果传递给 PostProcesser,然后传递给聚合器以组合它们...... ) 只是出于好奇,您为什么想到 DataFlow?
-
另外,您能否添加一个示例,说明您认为您的客户端代码(Pool 的用户)会是什么样子?或者您希望它看起来像什么?
-
@LorenzoDematté 因为它开箱即用地非常有效地处理并发活动,但是,就像你说的,我不知道如何取回结果。
标签: c# .net task-parallel-library async-await tpl-dataflow