如何从线程池正确访问ArrayList?

时间:2011-03-29 17:28:26

标签: c# multithreading thread-safety threadpool

我在c#应用程序上使用ThreadPool,我需要在“全局”ArrayList中添加和删除项目。线程将随时访问相同的ArrayList。我该如何以安全的方式做到这一点?因此,没有线程会同时尝试访问ArrayList。

我正在用这个开始线程:

my_args args = new my_args(input, id, this);
ThreadPool.QueueUserWorkItem(new WaitCallback(generateKeywords), args);

4 个答案:

答案 0 :(得分:2)

您可以围绕ArrayList

创建一个线程安全包装器
ArrayList list = new ArrayList();
ArrayList threadSafeList = ArrayList.Synchronized(list);

但请注意,即使使用同步ArrayList,通过列表枚举仍然不安全。有关详细信息,请参阅this msdn page

我可以问你为什么使用ArrayList代替通用集合吗?如果您使用列表作为队列来提供几个工作进程,并且您使用的是.net 4.0,那么您可以使用BlockingCollection<T>对象。有关详细信息,请参阅this msdn page

答案 1 :(得分:1)

我会使用SyncRoot来锁定数组。

lock(((ICollection)myArray).SyncRoot)
{

}

答案 2 :(得分:0)

您可以尝试将lock语句与数组一起用作参数:

lock(myArray){
//do what you want, your array will be protected in this block of code
}

答案 3 :(得分:0)

如果您有可用的.NET 4,更好的选择是使用System.Collections.Concurrent中的一个集合。这些都提供线程安全的读写,无需显式锁定。

(其中一些集合是无锁的,有些使用细粒度锁定,但它们都是线程安全的,您无需担心它。)