Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# HttpContext.Current.Items的替代方案_C#_Asp.net_Static_Thread Safety_Httpcontext - Fatal编程技术网

C# HttpContext.Current.Items的替代方案

C# HttpContext.Current.Items的替代方案,c#,asp.net,static,thread-safety,httpcontext,C#,Asp.net,Static,Thread Safety,Httpcontext,最近,我在我们的系统中发现了一个bug,其中dll中的一个属性是共享的。在ASP.Net的情况下,这会导致线程安全问题 protected static object Data { get; set; } 为了用尽可能小的更改来解决这个问题,我交换了内部属性,以使用HttpContext.Current.Items来存储和检索值。这适用于我们的网站 但是,我们还有一个引用此dll的exe。当它运行时(显然)没有对HttpContext.Current的引用 是否有可供选择的对象可用于asp.n

最近,我在我们的系统中发现了一个bug,其中dll中的一个属性是共享的。在ASP.Net的情况下,这会导致线程安全问题

protected static object Data { get; set; }
为了用尽可能小的更改来解决这个问题,我交换了内部属性,以使用
HttpContext.Current.Items
来存储和检索值。这适用于我们的网站

但是,我们还有一个引用此dll的exe。当它运行时(显然)没有对
HttpContext.Current
的引用


是否有可供选择的对象可用于asp.net和/或exe。如果有必要,我愿意使用分支逻辑来确定要命中哪个属性,只要我只需要更改这个属性(显然,两个属性都需要一个解决方案。

因此
[ThreadStatic]
属性在这种情况下可能会有所帮助,但需要注意

Scott Hanselman就
ThreadStatic
的使用写了一篇文章。特别是,这一部分是相关的:

当您在ASP.NET中操作时,不要在静态成员上添加[ThreadStatic]属性,因为您可能无法控制线程生命周期…您继承了一个工作线程。ThreadStatic为您提供线程本地存储,而不是HttpContext本地存储

基本上,由于(IIS)工作者有重用应用程序池中线程的倾向,因此通常不建议将此属性用于web进程

为了应用这一点,在保持Web请求的线程安全性的同时(并且仅涉及属性),您可以使用分支逻辑来确定要从哪些部分存储/检索数据:

[ThreadStatic]
private static object _data;

protected static object Data
{
    get
    {
        if (HttpContext.Current != null)
            return HttpContext.Current.Items[DataKey] as object;
        else
            return _data;
    }
    set
    {
        if (HttpContext.Current != null)
            HttpContext.Current.Items[DataKey] = value;
        else
            _data = value;
    }
}

因此,
[ThreadStatic]
属性在这种情况下可能会有所帮助,但它附带了一些警告

Scott Hanselman就
ThreadStatic
的使用写了一篇文章。特别是,这一部分是相关的:

当您在ASP.NET中操作时,不要在静态成员上添加[ThreadStatic]属性,因为您可能无法控制线程生命周期…您继承了一个工作线程。ThreadStatic为您提供线程本地存储,而不是HttpContext本地存储

基本上,由于(IIS)工作者有重用应用程序池中线程的倾向,因此通常不建议将此属性用于web进程

为了应用这一点,在保持Web请求的线程安全性的同时(并且仅涉及属性),您可以使用分支逻辑来确定要从哪些部分存储/检索数据:

[ThreadStatic]
private static object _data;

protected static object Data
{
    get
    {
        if (HttpContext.Current != null)
            return HttpContext.Current.Items[DataKey] as object;
        else
            return _data;
    }
    set
    {
        if (HttpContext.Current != null)
            HttpContext.Current.Items[DataKey] = value;
        else
            _data = value;
    }
}

我找到了
[ThreadStatic]
属性。这对exe和Asp.Net调用方都有效吗?我找到了
[ThreadStatic]
属性。这对exe和Asp.Net调用方都有效吗?