2011-05-23 67 views
2

尽管在多线程中,但自从我将下面的行添加到我的应用程序后,它似乎经常崩溃,所以我假设它不是线程安全的。线程安全阵列

private readonly string [] _foo = Enumerable.Range(1,1000).Select(i => i.ToString())。ToArray();

我的选择是什么让这个线程安全?

+3

该行代码没有任何正确或错误。你需要向我们展示你如何使用foo数组,这可能是问题所在。 – BFree 2011-05-23 14:19:32

+0

对不起,有这么有限的信息,我会尽力让你们有更多的时间。再次感谢你的帮助。 – 2011-05-23 14:23:51

回答

1

初始化数组的代码很好。您将数组标记为readonly,这意味着无法将新数组分配给_foo字段 - 但您的代码仍然可以修改数组的元素。操作本身不会导致崩溃,但如果数组从多个线程更改,则可能会得到意外的结果。

没有更多的信息,很难说出什么问题。您的应用程序崩溃的方式是什么?

1

如果您使用的是C#4,则可以使用一些已经内置的集合。由于他们依赖无锁策略,他们比任何阻止收集都快。

看看在Concurrent Collections

0
  • List<T>T[] - >SynchronizedCollection<T>(注意,枚举不是线程安全的)
  • Dictionary<T> - >ConcurrentDictionary<T>
  • Queue<T> - >ConcurrentQueue<T>
  • Stack<T> - >ConcurrentStack<T>
  • 对于生产者 - 消费者场景也考虑BlockingCollection<T>