Я использую ASP.NET MVC 3. Как только я решил изменить некоторые из моих синхронных действий на асинхронные. Перед этим я создал выборочное асинхронное действие, чтобы проверить, будет ли он работать должным образом или нет. Это было примерно так:Инициализация культуры в асинхронном действии завершена
public void SampleAsync()
{
AsyncManager.OutstandingOperations.Increment();
var task = System.Threading.Tasks.Task.Factory.StartNew(() => DoStuff());
task.ContinueWith(t =>
{
AsyncManager.Parameters["pars"] = t.Result;
AsyncManager.OutstandingOperations.Decrement();
});
}
private object DoStuff()
{
System.Threading.Thread.Sleep(20000);
return null;
}
public ActionResult SampleCompleted(object pars)
{
return View();
}
Но это действие не срабатывало асинхронно! Это было абсолютно синхронно. По крайней мере, это было блокирование других запросов (во время работы) как традиционное действие. После нескольких часов исследования я обнаружил, что проблема была в моем asax где я инициализирующий текущую культуру:
protected void Application_AcquireRequestState(object sender, EventArgs e)
{
CultureInfo ci;
//It's important to check whether session object is ready
if (HttpContext.Current.Session != null)
{
ci = (CultureInfo)this.Session["Culture"];
//Checking first if there is no value in session
//and set default language
//this can happen for first user's request
if (ci == null)
{
ci = GetCultureFromCookie();
this.Session["Culture"] = ci;
}
if (ci == null)
{
ci = GetStandardCulture();
this.Session["Culture"] = ci;
}
}
else
{
ci = GetCultureFromCookie();
if (ci == null) ci = GetStandardCulture();
}
//Finally setting culture for each request
Thread.CurrentThread.CurrentUICulture = ci;
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(ci.Name);
}
Когда я закомментировать этот метод, все начало работать нормально. Я предполагаю, что проблема связана с доступом к HttpContext.Current из полного потока действий. Но в этом случае, как я должен начать текущую культуру пользователя?
Это очень хороший, всеобъемлющий ответ. Спасибо! –