我有一个使用 HTTP 侦听器编写的 HTTP 服务器,我想以某种方式声明某些变量可以从线程中的任何位置访问。
- 我的网络服务器类是基于实例的,所以我不能真正使用静态变量。
- 我可以使用实例变量,因为所有代码都在一个类中,但是……我不知道。
我想过使用字典:Dictionary</*[type of Thread ID here]*/,ThreadData>
,但我担心可能存在线程问题。ThreadData
可能是一个类实例,但我可能会使用一个结构,这取决于哪个更有效。
- 如果我将字典键入线程 ID 并对其进行编程,以便一个线程只在字典中请求它自己的条目,那么在访问字典时是否会出现任何与线程相关的问题?
- 每个线程都会添加自己的条目。添加新线程项时是否必须锁定字典?如果是这样,我是否可以使用单独的锁定对象来允许线程同时访问自己的数据?
使用并发字典会有优势吗?还有另一种更线程安全的方法吗?
我目前正在使用ThreadPool.QueueUserWorkItem
. 我不确定这是否为每个项目使用了一个新线程。如果没有,那么我也可以将其键入上下文。
更新:根据ThreadPool 类 - MSDN,它确实重用了线程。而且它不会清除线程数据。
线程池重用线程时,不会清除线程本地存储中的数据,也不会清除带有 ThreadStaticAttribute 属性标记的字段中的数据。因此,当一个方法检查线程本地存储或标记有 ThreadStaticAttribute 属性的字段时,它找到的值可能是线程池线程的早期使用遗留下来的。