【发布时间】:2016-10-03 23:04:01
【问题描述】:
我有一个 Windows 服务(使用 Topshelf),它托管一个 WCF 服务(使用 SimpleInjectorServiceHost 创建)并启动线程(使用 Task.Run)。
这个想法是:
-
WCF服务接收命令 - 将这些命令发布到
BufferBlock<T>。服务需要将此BufferBlock<T>注入其构造函数 - 线程应该是
TransformBlock<T>'s,它将执行所需的操作并返回结果 - 此结果需要通过
WCF服务方法读回并返回给调用者
我刚开始使用 TPL 数据流,所以我对动作块的理解可能完全错误
我在 Windows 服务的 OnStart 方法中旋转线程
for(var i = 0, i < Environment.ProcessorCount, ++i)
{
Task.Run(() =>
{
using (var scope = Bootstrapper.BeginScope())
{
var threadHost = Bootstrapper.GetInstance<IThreadHost>();
threadHost.DoWork(_cancellationTokenSource.Token);
}
}, _cancellationTokenSource.Token);
};
Bootstrapper.BeginScope 只是抽象出 SimpleInjector 的 _container.BeginLifetimeScope() 方法
IThreadHost/ThreadHost 是一个简单的接口/类,每个命令类型都有方法。 DoWork 应该在 BufferBlock 上等待,一旦可用就处理每个项目。
WCF 服务启动使用
if (_serviceHost != null)
{
_serviceHost.Close();
}
_serviceHost = Bootstrapper.CreateServiceHost(typeof(NodeService));
_serviceHost.Open();
Bootstrapper.CreateServiceHost 只是抽象出new SimpleInjectorServiceHost(_container, serviceType)。
问:BufferBlock<T> 是否应该是在SimpleInjector 注册的单例?
问:如何将每个threadHost的DoWork设置为TransformBlock<T>并链接到BufferBlock<T>?
问:如何在我的WCF 服务方法中获得TransformBlock<T> 的输出? WCF 服务方法将命令写入BufferBlock<T> 然后需要以某种方式等待输出?
【问题讨论】:
标签: c# wcf task-parallel-library simple-injector tpl-dataflow