迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 >

C# 中的线程安全列表

作者:迹忆客 最近更新:2024/01/03 浏览次数:

本教程将介绍在 C# 中创建线程安全列表的方法。


C# 中带有 ConcurrentBag 类的线程安全列表

ConcurrentBag 类用于在 C# 中创建线程安全的无序数据集合。ConcurrentBag 类与 C# 中的 List 非常相似,可以在 C# 中用作线程安全列表。要使用 ConcurrentBag 类,我们必须在项目中导入 System.Collections.Concurrent 名称空间。多个线程可以同时访问 ConcurrentBag 对象,但是 ConcurrentBag 对象内部的内容只能同步修改。它使它既可以与多个线程一起用于并发操作,又可以防止意外数据丢失。以下代码示例向我们展示了如何使用 C# 中的 ConcurrentBag 类创建线程安全列表。

using System;
using System.Collections.Concurrent;
using System.Collections.Generic;

namespace thread_safe_list {
  class Program {
    static void Main(string[] args) {
      ConcurrentBag<int> numbers = new ConcurrentBag<int>();
      numbers.Add(0);
      numbers.Add(1);
      numbers.Add(2);
      numbers.Add(3);
      numbers.Add(4);
      numbers.Add(5);
      Console.WriteLine("ConcurrentBag");
      foreach (var number in numbers) {
        Console.WriteLine(number);
      }
      List<int> nums = new List<int>();
      nums.Add(0);
      nums.Add(1);
      nums.Add(2);
      nums.Add(3);
      nums.Add(4);
      nums.Add(5);
      Console.WriteLine("List");
      foreach (var number in nums) {
        Console.WriteLine(number);
      }
    }
  }
}

输出:

ConcurrentBag
5
4
3
2
1
0
List
0
1
2
3
4
5

在上面的代码中,我们使用 C# 中的 ConcurrentBag 类创建了一个线程安全列表。在 ConcurrentBagList 数据结构中,添加新元素 Add() 的功能相同。唯一的区别是列表遵循先进先出(FIFO)的原则,而 ConcurrentBag 遵循先进先出(LIFO)的原则。下面的代码示例中解决了此问题。


C# 中带有 ConcurrentQueue 类的线程安全列表

ConcurrentQueue 类用于在 C# 中创建线程安全队列数据结构。ConcurrentQueue 按照先进先出的原则工作,就像 C# 中的 List 一样。可以使用 ConcurrentQueue 对象代替 List 对象来创建线程安全的数据结构。请参见以下示例代码。

using System;
using System.Collections.Concurrent;
using System.Collections.Generic;

namespace thread_safe_list {
  class Program {
    static void Main(string[] args) {
      Console.WriteLine("Concurrent Queue");
      ConcurrentQueue<int> numbers = new ConcurrentQueue<int>();
      numbers.Enqueue(0);
      numbers.Enqueue(1);
      numbers.Enqueue(2);
      numbers.Enqueue(3);
      numbers.Enqueue(4);
      numbers.Enqueue(5);
      foreach (var number in numbers) {
        Console.WriteLine(number);
      }
      Console.WriteLine("List");
      List<int> nums = new List<int>();
      nums.Add(0);
      nums.Add(1);
      nums.Add(2);
      nums.Add(3);
      nums.Add(4);
      nums.Add(5);
      foreach (var number in nums) {
        Console.WriteLine(number);
      }
    }
  }
}

输出:

Concurrent Queue
0
1
2
3
4
5
List
0
1
2
3
4
5

在上面的代码中,我们使用 C# 中的 ConcurrentQueue 类创建了线程安全的 List 数据结构。ListConcurrentQueue 数据结构中可用的方法之间有很多差异。例如,在 List 数据结构中添加新元素的方法是 Add()。相反,在 ConcurrentQueue 数据结构中添加新元素的方法是 Enqueue(),就像 C# 中的常规 Queue 数据结构一样。在下面的示例中解决了 ConcurrentQueue 数据结构的缺点。


C# 中带有 SynchronizedCollection 类的线程安全列表

SynchronizedCollection 类用于创建 C# 中某些指定类型的对象的线程安全集合。SynchronizedCollection 数据结构与 C# 中的 List 数据结构非常相似。两种数据结构都按照先进先出的原则工作。在 SynchronizedCollectionList 数据结构中添加新元素的功能是 Add()。请参见以下示例。

using System;
using System.Collections.Concurrent;
using System.Collections.Generic;

namespace thread_safe_list {
  class Program {
    static void Main(string[] args) {
      Console.WriteLine("Synchronized Collection");
      SynchronizedCollection<int> numbers = new SynchronizedCollection<int>();
      numbers.Add(0);
      numbers.Add(1);
      numbers.Add(2);
      numbers.Add(3);
      numbers.Add(4);
      numbers.Add(5);
      foreach (var number in numbers) {
        Console.WriteLine(number);
      }
      Console.WriteLine("List");
      List<int> nums = new List<int>();
      nums.Add(0);
      nums.Add(1);
      nums.Add(2);
      nums.Add(3);
      nums.Add(4);
      nums.Add(5);
      foreach (var number in nums) {
        Console.WriteLine(number);
      }
    }
  }
}

输出:

Synchronized Collection
0
1
2
3
4
5
List
0
1
2
3
4
5

在上面的代码中,我们使用 C# 中的 SynchronizedCollection 类创建了一个线程安全列表。到目前为止,此方法是在 C# 中实现列表数据结构功能的其他两种方法中最好的,因为它遵循相同的 FIFO 原理并且具有相同的方法。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

C# 从列表中删除元素

发布时间:2024/01/03 浏览次数:118 分类:编程语言

本文介绍如何从 C# 中的列表中删除元素的方法。它介绍了诸如 Remove(),RemoveAt()和 RemoveRange()之类的方法。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便