【发布时间】:2012-03-27 03:04:12
【问题描述】:
对于如何使用 Ninject 实现以下功能,我将不胜感激:
我有一个多线程应用程序。它同时运行大约 20 个非常独立的线程。在应用程序启动时,我使用 InThreadScope() 通过 Ninject 将接口绑定到对象,一切正常。每个线程接收特定于其线程的对象(每个对象的构造函数都会实例化许多线程特定的标志)。
每个线程所做的大部分工作都是等待数据存储完成过程。因此,为了进一步优化线程,我们在主要的 20 个线程中实现了 Parallel.ForEach 逻辑。我希望由 Paralell.ForEach 生成的线程获得与其父线程相同的绑定。但是,我不能简单地将接口重新绑定到 Parallel.ForEach 内的适当对象,我根本不知道绑定的对象是什么 - 在 Paralell.ForEach 内我只能使用接口。
在运行时从内核中检索绑定的正确方法是什么,在 Paralell.ForEach 启动并在循环内重新绑定它们之前?
编辑:尝试包含详细的逻辑/伪代码:
每个线程一旦启动就会执行以下操作:
Kernel.Bind<ILoggingContext>().To<Application1LoggingContext>().InThreadScope();
但是,当 Parallel.ForEach() 从各个线程内部启动时,我不再有权访问 Application1LoggingContext 对象并且无法将 ILoggingContext 重新绑定到它。这是因为 Parallel.ForEach() 是从基类运行的,并且不知道它需要绑定到哪个 Application LoggingContext。这是在每个应用程序中完成的,在启动 20 个大线程时完成。
我想修改基类,即启动 Parallel.ForEach() 并确保在 Parallel.ForEach 线程新创建的每个内部, ILoggingContext 仍然绑定到 Application1LoggingContext - 通常,这样我就可以执行以下操作:
var ctx = Kernel.Get<ILoggingContext>();
【问题讨论】:
-
能否请您发布您希望如何使用 Paralell.ForEach 的示例代码(伪代码)?
标签: c# multithreading inversion-of-control ninject