我正在处理一个多线程应用程序,因此,我总是试图不使用可能在我在不同线程中使用的类型实例中引发冲突的私有字段。相反,我一直在拖运我需要作为方法参数工作的信息。这导致了许多方法都声明了相同的参数:
private void MySubmethod(MyConfiguration configuration)
现在我正在考虑重新设计类型并为每个线程创建一个实例,但后来我偶然发现了ThreadStatic属性。
只是声明一个私有的threadstatic字段,在每个线程调用的main方法中初始化它并在所有子方法中重用该字段,使参数过时,这是一个好主意吗?或者它有任何缺点,所以我宁愿专注于为每个线程创建一个新实例吗?
[ThreadStatic]
private static MyConfiguration _configuration;
答案 0 :(得分:2)
只是声明一个私有的threadstatic字段,在每个线程调用的main方法中初始化它并在所有子方法中重用该字段,使参数过时后,这是一个好主意吗?
不,不是;这意味着任何触及线程的代码现在都非常不可靠;对于ThreadPool
,TPL和async
/ await
之类的东西,线程在现代应用程序中是不可避免的(即使它们在代码中是隐式的而不是显式的)。与线程相关的变量在调试时也存在很大问题。除非有非常良好的理由,否则我的建议是保留总体上下文,或插入现有的强大实现。例如,在Web应用程序中,您可以通过静态方法合理地访问当前请求 - 但即使您需要小心知道您是否在请求线程上,而不是在工作线程上应该知道它需要知道的所有东西都放在盘子里。