C# System.Web.HttpContext.Current在异步中是线程安全的吗?

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

MSDN说:

System.Web.HttpContext的任何公共静态成员都是线程 安全的


在我的代码中,是线程安全的吗?

您的代码是线程安全的,但编写起来很奇怪。为什么不写为:

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);