首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >System.Web.HttpContext.Current在异步中线程安全吗?

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

Stack Overflow用户
提问于 2014-02-25 13:38:02
回答 2查看 1.5K关注 0票数 0
代码语言:javascript
复制
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的任何公共静态成员都是线程安全的。

在我的密码里线程安全吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-26 01:00:06

您的代码是线程安全的,但是编写得很奇怪。为什么不把它写成:

代码语言:javascript
复制
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)。为了安全起见,我会重写上面的内容。

票数 0
EN

Stack Overflow用户

发布于 2014-02-27 16:15:35

它不是线程安全的,因为您在多个线程上并发地使用相同的HttpContext。医生没有说这是安全的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22015857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档