我有一个Windows服务,它一直循环直到它停止。每个循环后有一个15秒的线程间隔。我正在使用Unity容器来解析一个对象,如下所示:
var processes = ProcessConfigurationSection.GetProcesses();
while (!_stopped)
{
try
{
foreach (var process in processes)
{
var worker = new Worker(DiContainer.UnityContainer.Resolve<IProcessDao>());
worker.RunProcess(process.Name, process.StoredProcedure, process.BatchSize);
}
Thread.Sleep(_interval);
}
catch (Exception ex)
{
Log.LogEvent(...);
}
}
我应该在while循环中创建worker的实例(并解析对象),还是应该在while循环之外以获得性能优势?此外,这种方法中是否存在内存泄漏的可能性?
答案 0 :(得分:1)
您通常应该为每个请求定义一个范围。对于Web应用程序,这通常是一个持续Web请求生命周期的范围。但是对于Windows服务应用程序,仍然有请求,只有您必须决定您所看到的请求。每个RunProcess
调用可以是单个请求(因此是单个范围),也可以将整批processes
视为单个请求。
您不应该在循环外定义此范围,因为范围生活方式通常会实现在整个请求中重用的工作单元实现。例如,Entity Framework的DbContext
是一个工作单元。您不希望在应用程序的生命周期中重用相同的DbContext
,因为当操作失败时,您可能会损坏DbContext
,从而破坏整个应用程序。
使用Unity作用域使用子容器实现。您应该使用以下内容包装您的请求:
using (var child =
DiContainer.UnityContainer.CreateChildContainer())
{
var worker = new Worker(child.Resolve<IProcessDao>());
worker.RunProcess(process.Name, process.StoredProcedure,
process.BatchSize);
}
或许using (var child
应该包裹foreach
。这是你必须要做的事情。