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

发布于 2024-10-27 04:20:40 字数 296 浏览 3 评论 0原文

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

我用这个开始线程:

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

I am using ThreadPool on my c# application and I need to add and remove items from an "global" ArrayList. The threads will be accessing the same ArrayList at any time. How should I do this in a safe way? So no threads will try to access the ArrayList at the same time.

I am starting the threads with this:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

凹づ凸ル 2024-11-03 04:20:40

您可以围绕 ArrayList 创建一个线程安全的包装器:

ArrayList list = new ArrayList();
ArrayList threadSafeList = ArrayList.Synchronized(list);

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

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

You can create a thread safe wrapper around the ArrayList:

ArrayList list = new ArrayList();
ArrayList threadSafeList = ArrayList.Synchronized(list);

Note however that even with a synchronized ArrayList it is still not safe to enumerate through the list. See this msdn page for more information.

Can I ask why you use an ArrayList instead of a generic collection? If you use the list as a queue to feed a couple of worker processes, and you are using .net 4.0, then you can use a BlockingCollection<T> object. See this msdn page for more information.

黑色毁心梦 2024-11-03 04:20:40

我会使用 SyncRoot 来锁定阵列。

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

}

I would use SyncRoot to lock the array.

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

}
故人爱我别走 2024-11-03 04:20:40

您可以尝试使用 lock 语句将数组作为参数:

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

You may try to use lock statement with your array as argument:

lock(myArray){
//do what you want, your array will be protected in this block of code
}
巾帼英雄 2024-11-03 04:20:40

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

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

A better option, if you have .NET 4 available, would be to use one of the collections in System.Collections.Concurrent. These all provide thread safe reading and writing without explicitly locking.

(Some of these collections are lock free, some use fine grained locking, but they are all thread safe, without you having to worry about it.)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文