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

时间:2014-02-25 13:38:02

标签: c# multithreading

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 的任何公共静态成员都是线程   安全

我的代码是线程安全的吗?

2 个答案:

答案 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)。为了安全起见,我会按上述方法重写。