мое приложение в ASP.NET MVC 4.Entity Framework контекст для каждого запроса в ASP.NET и многопоточной
Я использую 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 в subthreads и используется в ключе контекста.
- Даже если я смогу передать httpcontext или null проверить его, если подпроцесс займет больше времени, чем сам запрос, он будет удален до завершения потока, что будет проблематично.
Любые решения?
Я даже не знал об этом. Я прочту больше об этом. Но проект уже очень большой (2 года, 2 разработчики, работающие полный рабочий день). Было бы массовым изменением, чтобы использовать это, или вы думаете, что это выполнимо? – Batista
Как избавиться от контекста? – Batista
Это зависит от структуры DI, но, насколько я знаю, прежде всего фреймворки поддерживают функцию автоматического удаления, когда область (HttpRequest в этом случае) завершена.Вы также можете написать неявный код утилизации. Вот, например, документы SimpleInjector; https://simpleinjector.readthedocs.org/en/latest/lifetimes.html#per-web-request –