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
类创建了一个线程安全列表。在 ConcurrentBag
和 List
数据结构中,添加新元素 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 数据结构。List
和 ConcurrentQueue
数据结构中可用的方法之间有很多差异。例如,在 List
数据结构中添加新元素的方法是 Add()
。相反,在 ConcurrentQueue
数据结构中添加新元素的方法是 Enqueue()
,就像 C# 中的常规 Queue
数据结构一样。在下面的示例中解决了 ConcurrentQueue
数据结构的缺点。
C# 中带有 SynchronizedCollection
类的线程安全列表
SynchronizedCollection
类用于创建 C# 中某些指定类型的对象的线程安全集合。SynchronizedCollection
数据结构与 C# 中的 List
数据结构非常相似。两种数据结构都按照先进先出的原则工作。在 SynchronizedCollection
和 List
数据结构中添加新元素的功能是 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 原理并且具有相同的方法。
相关文章
在 C# 中将 List<string>转换为字符串
发布时间:2024/03/16 浏览次数:198 分类:编程语言
-
在 C# 中,有两种主要方法可用于将 List
转换为字符串变量,Linq 方法和 String.Join()函数。
在 C# 中将 List<string>转换为字符串
发布时间:2024/03/16 浏览次数:171 分类:编程语言
-
在 C# 中,有两种主要方法可用于将 List
转换为字符串变量,Linq 方法和 String.Join()函数。
在 C# 中将 List<string>转换为字符串
发布时间:2024/03/16 浏览次数:187 分类:编程语言
-
在 C# 中,有两种主要方法可用于将 List
转换为字符串变量,Linq 方法和 String.Join()函数。
在 C# 中发出 HTTP POST Web 请求
发布时间:2024/02/04 浏览次数:131 分类:编程语言
-
在 C# 中,可以使用 3 种主要方法来发出 HTTP POST Web 请求:WebClient 类,HttpWebRequest 类和 HttpClient 类。本教程将讨论在 C# 中发出 HTTP POST Web 请求的方法。使用 C# 中的 WebClient 类发出 HTTP POST Web 请求
在 C# 中运行命令提示符命令
发布时间:2024/02/04 浏览次数:130 分类:编程语言
-
Process 类可用于在 C# 中运行命令提示符命令。在 C# 中使用 Process.Start() 函数运行命令提示符命令
在 C# 中调整图像大小
发布时间:2024/02/04 浏览次数:203 分类:编程语言
-
有两种主要方法可用于在 C# 中调整图像的大小,Bitmap 类构造函数和 graphics.DrawImage()函数。在本教程中,我们将讨论在C#中调整图像大小的方法。我们将带您完成整个过程,从加载原始图像到保
在 C# 中下载图片
发布时间:2024/02/04 浏览次数:138 分类:编程语言
-
有 3 种主要方法可用于下载 C# 中的图片,WebClient.DownloadFile()函数,Bitmap 类和 Image.FromStream()函数。在 C# 中使用 WebClient 类下载图片 WebClient 类提供了用于向 C# 中的 URL 发送数据和从 URL 接收数据
在 C# 中使用秒表
发布时间:2024/02/04 浏览次数:139 分类:编程语言
-
我们可以使用 Stopwatch 类来计算 C# 中的经过时间。使用 C# 中的秒表类计算经过时间 Stopwatch 类在 C# 中准确测量经过的时间。
在 C# 中获取可执行路径
发布时间:2024/02/04 浏览次数:200 分类:编程语言
-
有 3 种主要方法可用于获取 C# 中程序的可执行路径,即 Assembly 类,AppDomain 类和 Path 类。本教程将介绍获取 C# 代码的可执行路径的方法。使用 C# 中的 Assembly 类获取可执行路径