您应该意识到运行后台线程可能会导致许多问题。 IIS 可以随时决定回收应用程序池,这将立即终止您的线程(或者在某些情况下根本不执行),使您的应用程序处于不一致的状态。
http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspx http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspx
运行异步操作的最简单且最不容易出错的方法是实现 Windows 服务并将这些异步操作委托给 Windows 服务,例如使用 MSMQ。
如果您仍然想走艰难的路,那么请阅读HostingEnvironment.RegisterObject
and IRegisteredObject
以避免出现这些不一致的情况。
Ninject 部分非常简单。只需创建一些作业处理器类,例如MyJobProcessor
获取执行任务所需的所有依赖项。应该实施INotifyWhenDisposed
。最简单的方法是从DisposeNotifyingObject
.
public class MyJobProcessor : DisposeNotifyingObject, IRegisteredObject
{
public void Execute() { ... }
public void Stop(bool immediate) { ... }
}
将此处理器注入到控制器中,让任务启动它并在完成工作后将其处置。
Task.Factory.StartNew(() =>
{
try
{
processor.Execute();
}
finally
{
processor.Dispose);
}
});
指定它是其依赖项的范围。
Bind<MyJobProcessor>().ToSelf().Named("MyJobProcessor").DefinesNamedScope("MyJobProcessorScope");
Bind<IUnitOfWork>().To<UnitOfWork>().WhenAnyAnchestorNamed("MyJobProcessor").InNamedScope("MyJobProcessorScope");