【发布时间】:2015-03-23 09:53:34
【问题描述】:
我的应用程序在 ASP.NET MVC 4 中。
我在每个请求中都使用 BDContext,正如这里的许多问题中所建议的那样。
我有:
public static class ContextPerRequest {
private const string myDbPerRequestContext = "dbGeTraining_";
public static DbGesForma_v2 db {
get {
if (!HttpContext.Current.Items.Contains(myDbPerRequestContext + HttpContext.Current.GetHashCode().ToString("x") + Thread.CurrentContext.ContextID.ToString())) {
HttpContext.Current.Items.Add(myDbPerRequestContext + HttpContext.Current.GetHashCode().ToString("x") + Thread.CurrentContext.ContextID.ToString(), new DbGesForma_v2());
}
return HttpContext.Current.Items[myDbPerRequestContext + HttpContext.Current.GetHashCode().ToString("x") + Thread.CurrentContext.ContextID.ToString()] as DbGesForma_v2;
}
}
/// <summary>
/// Called automatically on Application_EndRequest()
/// </summary>
public static void DisposeDbContextPerRequest() {
// Getting dbContext directly to avoid creating it in case it was not already created.
var entityContext = HttpContext.Current.Items[myDbPerRequestContext + HttpContext.Current.GetHashCode().ToString("x") + Thread.CurrentContext.ContextID.ToString()] as DbGesForma_v2;
if (entityContext != null) {
entityContext.Dispose();
HttpContext.Current.Items.Remove(myDbPerRequestContext + HttpContext.Current.GetHashCode().ToString("x") + Thread.CurrentContext.ContextID.ToString());
}
}
}
我在 Application_EndRequest() 方法中处理它。这种方法在很长一段时间内都行之有效。
现在我正在尝试用这样的异步任务来实现一些东西:
Task.Factory.StartNew(() => {
DoSomething();
});
这会带来一些问题。
- HttpContext在子线程中为null,用于上下文的key中。
- 即使我能够通过 httpcontext 或对它进行空检查,如果子线程的运行时间比请求本身更长,它也会在线程完成之前被释放,这将是有问题的。
有什么解决办法吗?
【问题讨论】:
标签: c# asp.net multithreading entity-framework httpcontext