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

C# 如何从线程池正确访问ArrayList?,c#,multithreading,thread-safety,threadpool,C#,Multithreading,Thread Safety,Threadpool,我正在c#应用程序上使用ThreadPool,需要在“全局”数组列表中添加和删除项。线程将随时访问相同的ArrayList。我应该如何以安全的方式执行此操作?因此,没有线程会同时尝试访问ArrayList 我从以下内容开始: my_args args = new my_args(input, id, this); ThreadPool.QueueUserWorkItem(new WaitCallback(generateKeywords), args); 您可以尝试将lock语句与数组一起用作

我正在c#应用程序上使用
ThreadPool
,需要在“全局”数组列表中添加和删除项。线程将随时访问相同的
ArrayList
。我应该如何以安全的方式执行此操作?因此,没有线程会同时尝试访问ArrayList

我从以下内容开始:

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

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

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

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

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

您可以围绕
ArrayList
创建线程安全包装:

ArrayList list = new ArrayList();
ArrayList threadSafeList = ArrayList.Synchronized(list);
但是请注意,即使使用synchronized
ArrayList
,在列表中枚举仍然不安全。有关更多信息,请参阅


我可以问一下为什么使用
ArrayList
而不是泛型集合吗?如果使用列表作为队列来为几个工作进程提供数据,并且使用.net 4.0,则可以使用
BlockingCollection
对象。有关详细信息,请参阅。

您可以在
阵列列表周围创建线程安全包装器。

ArrayList list = new ArrayList();
ArrayList threadSafeList = ArrayList.Synchronized(list);
但是请注意,即使使用synchronized
ArrayList
,在列表中枚举仍然不安全。有关更多信息,请参阅


我可以问一下为什么使用
ArrayList
而不是泛型集合吗?如果使用列表作为队列来为几个工作进程提供数据,并且使用.net 4.0,则可以使用
BlockingCollection
对象。有关详细信息,请参阅。

我将使用SyncRoot锁定阵列

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

}

我将使用SyncRoot锁定阵列

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

}

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


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

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


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

锁定集合是不好的做法。最好使用单独的对象进行同步使用同步对象聚合是一种很好的方法,也许是最好的方法,但是为什么不锁定阵列呢?毕竟它也是一个物体。无论如何,使用同步对象至少是解决这个问题的一种更优雅的方法,所以,是的!,使用同步对象。注意同步同一对象。为此,您可以使用静态对象。使用单独的对象还可以防止错误地认为数组实际上已锁定。此代码仅在所有线程都首先请求锁定时有效。锁定集合是错误的做法。最好使用单独的对象进行同步使用同步对象聚合是一种很好的方法,也许是最好的方法,但是为什么不锁定阵列呢?毕竟它也是一个物体。无论如何,使用同步对象至少是解决这个问题的一种更优雅的方法,所以,是的!,使用同步对象。注意同步同一对象。为此,您可以使用静态对象。使用单独的对象还可以防止错误地认为数组实际上已锁定。只有当所有线程都先请求锁时,此代码才有效。