最近在做一个项目的时候,发现标记了ThreadStatic特性的静态变量,即使默认已经初始化,但在使用的时候仍然可能为NULL,以下是一段测试代码:
(不清楚ThreadStatic的可以点击这https://docs.microsoft.com/en-us/dotnet/api/system.threadstaticattribute)
public class Program { public static void Main(string[] args) { List<Task> tasks = new List<Task>(); for (int i = 0; i < 10; i++) { Task task = Task.Run(() => new ShowString().Show()); tasks.Add(task); } Task.WaitAll(tasks.ToArray()); } } public class StaticClass { [ThreadStatic] public static Dictionary<string,object> StaticDict = new Dictionary<string, object>(); } public class ShowString { public void Show() { Console.WriteLine(StaticClass.StaticDict.Count); } }
在以上代码可以看到,在声明StaticClass.StaticDict的时候就已经进行了初始化,但是在实际的运行过程中会出现为NULL的情况。
解决方法:修改StaticClass为如下代码:
public class StaticClass { [ThreadStatic] private static Dictionary<string,object> _staticDict = null; public static Dictionary<string, object> StaticDict { get { _staticDict = _staticDict ?? new Dictionary<string, object>(); return _staticDict; } } }
注意:在使用ThreadStatic 时,如果使用Task去启动一个线程,一定要小心线程复用的问题
原文:https://www.cnblogs.com/zhurongbo/p/10362508.html