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的任何公共静态成员都是线程安全的。
在我的密码里线程安全吗?
发布于 2014-02-26 01:00:06
您的代码是线程安全的,但是编写得很奇怪。为什么不把它写成:
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)。为了安全起见,我会重写上面的内容。
发布于 2014-02-27 16:15:35
它不是线程安全的,因为您在多个线程上并发地使用相同的HttpContext。医生没有说这是安全的。
https://stackoverflow.com/questions/22015857
复制相似问题