如何以线程安全的方式为每个 HTTP 请求维护一个对象?

模拟

我的页面代码在 Session 和其他 HTTPContext.current 项目中设置值。这些值用于其他类文件中,这些文件存在于 App Code 下。

为了实现某些功能的线程化,我需要删除其他类文件中 HTTPContext 的使用(稍后可能会成为单独的程序集)。为了以线程安全的方式在页面代码和其他对象之间传递值,我尝试过,

a) 将当前 HTTPContext 作为对象传递给新线程 - 失败,因为新线程中的引用与主对象一起被销毁。

b) 静态类和成员 - 问题是它们对于每个请求都没有不同。在整个应用程序中,它们是相同的。

c) 我们可以创建一个带有公共成员的简单类,其值将在页面上设置,并且对象必须在需要时随代码传递。这里的问题是,我必须在整个应用程序中更改代码,以便将对象与每个函数一起传递。

d) 听说过 Singleton - 看起来这是一个延伸而不是正确的答案。

基本上,我正在寻找一种标准做法,它可以让我为每个请求唯一维护的类成员设置值,该成员可以传递给新线程。任何有助于在 .net 上实现这一目标的指针?

艾伯特·K

如果可能,您绝对应该使用 C 方法并通过参数显式地将数据传递给方法和线程。代码会更明确。如果不可能,您可以使用以下方法:

public SomeClass{
    public static ConcurrentDictionary<Thread, HttpContextData> HttpContextData 
        = new ConcurrentDictionary<Thread, HttpContextData>();
}

// class to hold HttpContext related data
class HttpContextData { ... }


// somewhere in Asp.Net app...
ThreadStart fireAndForgetFunc = () =>
{
    var data = SomeClass.HttpContextData.GetValueOrDefault(Thread.CurrentThread);
    // work with HttpContextData
};

fireAndForgetFunc += () => 
{  
    // adding a cleanup
    SomeClass.HttpContextData.TryRemove(Thread.CurrentThread, out HttpContextData data); 
};
Thread t = new Thread(fireAndForgetFunc);

var httpContextData = new HttpContextData() {};
SomeClass.HttpContextData.TryAdd(t, httpContextData);
t.Start();

但你应该记住:

  1. 此代码有点棘手,应仅用作解决方法
  2. 如果线程中止或抛出异常,则不会执行清理
  3. 可以从多个线程访问 HttpContextData。在这种情况下,您需要了解线程安全。

回答评论中的问题

ConcurrentDictionary 就像通常的字典一样,但它是线程安全的,可以在没有任何锁的多线程环境中使用。

是的,字典将整个应用程序共享,但在字典中的每个条目将被相关的某些threadHttpContextData在asp.net代码http请求处理某处过程中分配给它。

由于上下文数据被移动到一个单独的对象,它将在“Fire and Forget”函数下调用整个代码树中的代码更改。

它只会调用如下更改。改变这一点:

var data = HTTPContext.Current.GetSomeData();

至:

var data = _httpContextData.GetValueOrDefault(Thread.CurrentThread);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为一个请求设置HTTP标头

如何以编程方式发送带参数的HTTP请求?

每个HTTP请求是否应该有一个新的datastore.Client?

如何仅通过一个HTTP请求实例化2个不同的对象(JSON文件)

批量并行HTTP请求,每个请求都有一个异步for循环

如何从一个Docker容器向另一个链接的容器发出HTTP请求?

Rails:每个http请求都会创建一个新的连接池吗?

如何以简洁的方式安全地访问容器中的每个第n个元素?

如何仅通过一个HTTP请求从事件存储流中获取最后一个事件?

如何发送一个普通的http请求到URL?

如何基于从另一个可观察对象返回的键中的键创建可观察/ http请求的数组

如何在Jmeter中将值从一个HTTP请求传递到另一个

如何在Angular App中使用另一个对象的值创建一个通过HTTP POST请求发送的对象?

Elm:如何在后续请求中使用来自一个HTTP请求的数据

如何维护几个只能在一个对象中存在一个对象的集合?

为每个线程生成一个新的对象实例是否是线程安全的操作?

如何在Hibernate中每2个HTTP请求访问一个实体对象?

如何在每个请求中一个接一个地存储多个对象?

使用Apache2(或Nginx)处理Http请求。是否为每个或一组N个请求创建一个新进程?

将http请求信息从另一个线程添加到哨兵

如何完成2个HTTP请求,然后触发另一个Action合并结果

如何在另一个HTTP请求中使用来自一个HTTP请求的$ scope值

Swift 异步 HTTP 请求会创建另一个线程吗?

为 HTTP 请求创建一个中心

Angular 4 - 如何从另一个 http 请求中的 http 请求同步获取值?

如何编写一个发出http请求并返回请求结果的函数?

如何以编程方式为数据快照的每个子项制作一个按钮?

使用 Rxjs 为上一个请求响应中的每个项目执行 http 请求

如何在另一个线程上运行阻塞代码并使http请求立即返回