使用并行库添加到列表时保证线程安全的正确方法

发布于 2024-12-26 03:02:23 字数 317 浏览 1 评论 0原文

我循环访问连接字符串数组,并在每个循环中提取一些信息并将其添加到列表中。现在,我想使用并行库使其成为多线程,但我不确定该库是否保证对列表的写入是线程安全的,或者我是否需要使用锁定:

List<SomeType> list = new List<SomeType>();

settings.AsParallel().ForAll(setting => 
{
    list.AddRange(GetSomeArrayofSomeType(setting)); /// DO I NEED TO DO LOCKING HERE???
})

I loop over an array of connection strings and on each loop I extract some information and add to the list. Now, I want to use Parallel library to make it multithreaded, but I'm not sure if the library guarantees that writes to the list would be thread-safe or whether I need to use locking:

List<SomeType> list = new List<SomeType>();

settings.AsParallel().ForAll(setting => 
{
    list.AddRange(GetSomeArrayofSomeType(setting)); /// DO I NEED TO DO LOCKING HERE???
})

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

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

发布评论

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

评论(1

不知在何时 2025-01-02 03:02:23

对于多线程写入来说,写入列表确实不安全。您需要使用来同步访问,或者使用像ConcurrentQueue这样专为多线程访问而设计的集合。

锁定示例(假设 list 是方法的本地方法)

List<SomeType> list = new List<SomeType>();
settings.AsParallel().ForAll(setting => { 
  lock (list) {
    list.AddRange(GetSomeArrayofSomeType(setting)); 
  }
});

或者更好的是使用 SelectMany 而不是 ForEach

var list = settings
  .AsParallel()
  .SelectMany(setting => GetSomeArrayOfSomeType(setting))
  .ToList();

Write's to the list are indeed not safe for multithreaded writes. You need to either use a lock to synchronize access or use a collection like ConcurrentQueue which is designed for multithreaded access.

Lock example (assuming list is a local of a method)

List<SomeType> list = new List<SomeType>();
settings.AsParallel().ForAll(setting => { 
  lock (list) {
    list.AddRange(GetSomeArrayofSomeType(setting)); 
  }
});

Or better yet use SelectMany instead of ForEach

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