在Parallel.Foreach循环中创建组件时保持组合根(线程)

问题描述 投票:2回答:1

我正在尝试在Parallel ForEach循环中学习正确的方法,以便不引用组合根,而是根据组合根中引用的组件创建一个线程组件。

这是组合根代码:

var builder = new ContainerBuilder();
builder.RegisterType<OperationFiscalCalendarSql>().As<IOperationCloser>().InstancePerDependency();
builder.RegisterType<SQLMessagePoller>().As<IMessagePoller>().SingleInstance();
...
var container = builder.Build();
using (var scope = container.BeginLifetimeScope())
{
...
}

这是具有foreach循环的poller对象中引用的代码:

Parallel.ForEach(messageHeaders, new ParallelOptions { MaxDegreeOfParallelism = _maxDegreeOfParallelism }, messageHeader => {
    ...
    var sapCloser = new OperationFiscalCalendarSql(closeObj, repostiory);
    ...                        
}); 

注意我想要一个IOperationCloser实例,而不是硬编码一个'新的'OperationFiscalCalendarSql对象。

我理解构造函数注入我只是不知道如何在任何类型的循环中注入IOperationCloser。

multithreading autofac
1个回答
1
投票

您可以使用PollerFunc<IOperationCloser>对象中注入工厂,然后在ForEach循环中获取新实例。

在你的情况下,创建自己的ILifetimeScope可能更好。您可以通过在ILieetimeScope中注入Poller然后在循环中调用BeginLifetimeScopeResolve来完成此操作。

Parallel.ForEach(messageHeaders, ..., m => {
    using(ILifetimeScope childScope = scope.BeginLifetimeScope()){
        var param1 = new TypedParameter(m);
        var closer = childScope.Resolve<IOperationCloser>(param1);
    });
});
© www.soinside.com 2019 - 2024. All rights reserved.