public ActionResult AsyncAction()
{
Task task = new Task(httpContext => {
System.Web.HttpContext.Current = httpContext as HttpContext;
Thread.Sleep(1000 * 10);
var x = System.Web.HttpContext.Current.Request.Form["x"];
//To do...Contains IO/NET Write/Read Operation...
}, System.Web.HttpContext.Current);
task.Start();
return View();
}
MSDN 说:
System.Web.HttpContext 的任何公共静态成员都是线程 安全
我的代码是线程安全的吗?
答案 0 :(得分:1)
它不是线程安全的,因为您在多个线程上同时使用相同的HttpContext
。文档并未声明这是安全的。
答案 1 :(得分:0)
您的代码是线程安全的,但写得很奇怪。为什么不把它写成:
Task task = new Task(httpContext => {
Thread.Sleep(1000 * 10);
var x = httpContext.Request.Form["x"];
//To do...Contains IO/NET Write/Read Operation...
}, System.Web.HttpContext.Current);
一般来说,我更喜欢尽可能少地使用Current
,而是明确地传递上下文。这样,即使异步调用代码,您的代码也会正常工作。
除非你的问题具体是关于分配给Current
属性并且当你的属性睡着时不被另一个线程更改?这当然看起来是安全的事情,但我找不到支持它的文档,并且在Reflector中查看System.Web
它显然不可能(例如它没有标记为TheadLocal
)。为了安全起见,我会按上述方法重写。