Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
я нашел определенное количество тематических статей, но практически все они были ориентированы на использование Entity Framework как хранилища пользовательских данных.
Это звучит разумно и логично, однако мне не ясно следующее. Как работать с ASP.NET Identity + EF если у него есть такая проблема(например невозможно сделать два await вызова к одному контексту)?
public async Task<ActionResult> Index()
{
var dbContext = new TestEntites();
var something = await dbContext.Foo.FirstOrDefaultAsync(e => e.Id == 1);
var morething = await dbContext.Foo.FirstOrDefaultAsync(e => e.Id == 2);
return View();
}
public async Task<JsonResult> Index()
{
int initialThreadId = System.Threading.Thread.CurrentThread.ManagedThreadId;
var dbContext = new TestEntites();
var something = await dbContext.Foo.FirstOrDefaultAsync(e => e.Id == 1);
int afterFirstAwaitThreadId = System.Threading.Thread.CurrentThread.ManagedThreadId;
var morething = await dbContext.Foo.FirstOrDefaultAsync(e => e.Id == 2);
int afterSecondAwaitThreadId = System.Threading.Thread.CurrentThread.ManagedThreadId;
return Json(new { initial = initialThreadId, first = afterFirstAwaitThreadId, second = afterSecondAwaitThreadId });
}
Я уверен, что её либо не запили вообще, либо это сделали не полностью.
Это легко проверить, ASP.NET для создания и выполнения Task'ок использует AspNetSynchronizationContext, который в свою очередь использует ThreadPool для управления потоками.
Можно попробовать создать много запросов к приложению, и ждать когда продолжение(continuation) веб-запроса будет выполняться не потоком инициатором запроса. И вот тогда будет проблема(я с ней столкнулся). Опять-таки это проблема EF, а не проблема ASP.NET, так как EF не потокобезопасен.
Начало работы с ASP.NET Identity