C# 中的執行緒安全列表

Muhammad Maisam Abbas 2024年2月16日
  1. C# 中帶有 ConcurrentBag 類的執行緒安全列表
  2. C# 中帶有 ConcurrentQueue 類的執行緒安全列表
  3. C# 中帶有 SynchronizedCollection 類的執行緒安全列表
C# 中的執行緒安全列表

本教程將介紹在 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 原理並且具有相同的方法。

Muhammad Maisam Abbas avatar Muhammad Maisam Abbas avatar

Maisam is a highly skilled and motivated Data Scientist. He has over 4 years of experience with Python programming language. He loves solving complex problems and sharing his results on the internet.

LinkedIn

相關文章 - Csharp Thread

相關文章 - Csharp List