我的页面代码在 Session 和其他 HTTPContext.current 项目中设置值。这些值用于其他类文件中,这些文件存在于 App Code 下。
为了实现某些功能的线程化,我需要删除其他类文件中 HTTPContext 的使用(稍后可能会成为单独的程序集)。为了以线程安全的方式在页面代码和其他对象之间传递值,我尝试过,
a) 将当前 HTTPContext 作为对象传递给新线程 - 失败,因为新线程中的引用与主对象一起被销毁。
b) 静态类和成员 - 问题是它们对于每个请求都没有不同。在整个应用程序中,它们是相同的。
c) 我们可以创建一个带有公共成员的简单类,其值将在页面上设置,并且对象必须在需要时随代码传递。这里的问题是,我必须在整个应用程序中更改代码,以便将对象与每个函数一起传递。
d) 听说过 Singleton - 看起来这是一个延伸而不是正确的答案。
基本上,我正在寻找一种标准做法,它可以让我为每个请求唯一维护的类成员设置值,该成员可以传递给新线程。任何有助于在 .net 上实现这一目标的指针?
如果可能,您绝对应该使用 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();
但你应该记住:
回答评论中的问题
ConcurrentDictionary
就像通常的字典一样,但它是线程安全的,可以在没有任何锁的多线程环境中使用。
是的,字典将整个应用程序共享,但在字典中的每个条目将被相关的某些thread
与HttpContextData
在asp.net代码http请求处理某处过程中分配给它。
由于上下文数据被移动到一个单独的对象,它将在“Fire and Forget”函数下调用整个代码树中的代码更改。
它只会调用如下更改。改变这一点:
var data = HTTPContext.Current.GetSomeData();
至:
var data = _httpContextData.GetValueOrDefault(Thread.CurrentThread);
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句