【发布时间】:2015-02-05 04:33:46
【问题描述】:
所以,我基本上是在尝试这样做,以便我可以运行多个任务,每个任务都有自己的 DbContext,这样它们就不会导致异常。基本上,就像 ASP.NET 异步处理程序的工作方式一样。现在我正在做一些事情来影响
// set up the unity container
// WON'T WORK the dbUnitOfWork will used in two tasks.
container.RegisterType<Framework.Data.IDbUnitOfWork, Framework.Data.EntityFramework.DbUnitOfWork>(Core.IoC.Lifetime.PerThread);
container.RegisterFactory<System.Data.Entity.DbContext, ContextFactory>(o => o.Create, Framework.Core.IoC.Lifetime.Transient);
AsyncContext.Run(() => app.Run());
// run the following code fragment with an Async Context from Nito
workers.AddRange(container.resolveAll<IWorker>());
foreach (var worker in workers) {
tasks.add(worker.WorkAsync());
}
Tasks.WhenAll(tasks);
但是发生的情况是,每次我因为在同一个 DbContext 上启动第二次操作而不断收到这个被诅咒的“NotSupportedException”。我尝试让我的 DbContext 在 Unity 中成为 PerThread,但这似乎仍然不起作用。我拉每个线程的方式(至少希望如此)是
Tasks.Run(() => worker.WorkAsync());
我只想能够运行一组任务,每个任务都有自己的 DbContext。使它们都可以异步地做独立的数据库操作。那么我该如何实现这种期望的行为。
【问题讨论】:
-
什么是 IWorker,它在 WorkAsync 中的作用是什么?
-
IWorker 有 1 个返回 Task 的方法 WorkAsync。
-
如何将 IDbUnitOfWork 注入到 IWorker 实现中?如果您只向我们展示代码会更容易
-
我只是做基于构造函数的依赖注入,构造函数看起来像 WorkerConcrete(IDbUnitOfWork dbUnitOfWork) { this.dbUnitOfWork = dbUnitOfWork; }
标签: c# entity-framework asynchronous