我在c#应用程序上使用ThreadPool
,我需要在“全局”ArrayList
中添加和删除项目。线程将随时访问相同的ArrayList
。我该如何以安全的方式做到这一点?因此,没有线程会同时尝试访问ArrayList。
我正在用这个开始线程:
my_args args = new my_args(input, id, this);
ThreadPool.QueueUserWorkItem(new WaitCallback(generateKeywords), args);
答案 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中的一个集合。这些都提供线程安全的读写,无需显式锁定。
(其中一些集合是无锁的,有些使用细粒度锁定,但它们都是线程安全的,您无需担心它。)