C# System.Web.HttpContext.Current在异步中是线程安全的吗?
MSDN说: System.Web.HttpContext的任何公共静态成员都是线程 安全的C# System.Web.HttpContext.Current在异步中是线程安全的吗?,c#,multithreading,C#,Multithreading,MSDN说: System.Web.HttpContext的任何公共静态成员都是线程 安全的 在我的代码中,是线程安全的吗?您的代码是线程安全的,但编写起来很奇怪。为什么不写为: public ActionResult AsyncAction() { Task task = new Task(httpContext => { System.Web.HttpContext.Current = httpContext as HttpContext; Th
在我的代码中,是线程安全的吗?您的代码是线程安全的,但编写起来很奇怪。为什么不写为:
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();
}
一般来说,我更喜欢尽可能少地使用Current
,而是显式地传递上下文。这样,即使异步调用代码,代码也可以正常工作
除非您的问题特别是关于分配到
当前
属性,并且在您的线程处于睡眠状态时不被其他线程更改?这看起来确实是一件安全的事情,但我找不到支持它的文档,并且在Reflector中查看System.Web
,这显然不是不可能的(例如,它没有标记为Theadalocal
)。为了安全起见,我将如上所述重写。它不是线程安全的,因为您在多个线程上同时使用相同的HttpContext
。文档中没有说明这是安全的。“如果一段代码在多个线程同时执行时功能正常,那么它就是线程安全的。”;这里看不到多个线程运行相同的代码。如果System.Web.HttpContext.Current
是线程安全的(我认为不是)。如果您可以将其用于异步
调用,则它不起作用。另外,您不应该将线程与ASP一起使用。见斯蒂芬·克利里关于此事的博客文章。
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);