【发布时间】:2012-01-20 20:51:47
【问题描述】:
我正在使用 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 有关。但是在这种情况下,我应该如何初始化用户当前的文化呢?
【问题讨论】:
标签: asp.net asp.net-mvc-3 asynchronous localization