我对多线程非常糟糕,但自从我将以下行添加到我的应用程序后,它似乎经常崩溃所以我假设它不是线程安全的。
private readonly string [] _foo = Enumerable.Range(1,1000).Select(i => i.ToString())。ToArray();
我有什么选择让这个线程安全?
答案 0 :(得分:1)
初始化数组的代码很好。您将数组标记为readonly
,这意味着无法将新数组分配给_foo
字段 - 但您的代码仍然可以修改数组的元素。操作本身不会导致崩溃,但如果从多个线程更改阵列,则可能会出现意外结果。
如果没有更多信息,很难说出问题所在。您的应用程序以何种方式崩溃?
答案 1 :(得分:1)
如果您使用的是C#4,则可以使用一些已内置的集合。它们比任何阻塞集合更快,因为它们依赖于无锁策略。
答案 2 :(得分:0)
List<T>
或T[]
- &gt; SynchronizedCollection<T>
(请注意枚举不是线程安全的)Dictionary<T>
- &gt; ConcurrentDictionary<T>
Queue<T>
- &gt; ConcurrentQueue<T>
Stack<T>
- &gt; ConcurrentStack<T>
BlockingCollection<T>
生产者 - 消费者场景