我正在使用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有關。但在這種情況下,我應該如何啓動用戶的當前文化?
這是一個非常好的綜合答案。謝謝! –