C# 多线程并发编程基础小结

 更新时间:2025年04月08日 08:42:02   作者:butterfly_onfly  
本文主要介绍了C# 多线程并发编程基础小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

1. 线程基础

1.1 线程简介

C# 中的线程是操作系统能够进行运算调度的最小单位,它被包含在进程中,是进程中的实际运作单位。一个进程可以包含多个线程,这些线程可以并发执行不同的任务。

1.2 线程的创建与启动

在 C# 中,可以使用 System.Threading.Thread 类来创建和管理线程。

创建线程:

Thread thread = new Thread(new ThreadStart(YourMethod));

启动线程:

thread.Start();

1.3 线程的状态

线程在其生命周期中会经历多种状态,包括新建、就绪、运行、阻塞和死亡等。

1.4 线程的优先级

C# 中的线程具有优先级,可以通过 Thread.Priority 属性来设置。优先级高的线程更有可能获得 CPU 时间片。

2. 多线程编程基础

2.1 线程同步

多线程编程中,由于多个线程可能同时访问共享资源,因此需要考虑同步问题。C# 提供了多种同步机制。

锁(Lock):

object lockObject = new object();
lock (lockObject)
{
    // 临界区代码
}

互斥量(Mutex):

Mutex mutex = new Mutex();
mutex.WaitOne();
// 临界区代码
mutex.ReleaseMutex();

信号量(Semaphore):

Semaphore semaphore = new Semaphore(1, 1);
semaphore.WaitOne();
// 临界区代码
semaphore.Release();

2.2 线程间通信

线程间通信是多线程编程中的重要部分,C# 提供了多种机制来实现线程间的通信。

事件(Event):

ManualResetEvent event = new ManualResetEvent(false);
event.Set(); // 通知其他线程
event.WaitOne(); // 等待其他线程通知

等待句柄(WaitHandle):

AutoResetEvent waitHandle = new AutoResetEvent(false);
waitHandle.Set(); // 通知其他线程
waitHandle.WaitOne(); // 等待其他线程通知

2.3 线程池

线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在后台以异步方式执行任务。

使用线程池:

ThreadPool.QueueUserWorkItem(new WaitCallback(YourMethod));

2.4 异步编程

C# 提供了异步编程模型(Async/Await),可以简化异步操作的编写。

异步方法:

public async Task<int> YourAsyncMethod()
{
    // 异步操作
    var result = await SomeAsyncOperation();
    return result;
}

3. 高级线程管理

3.1 并行类库(TPL)

.NET Framework 4 引入了任务并行库(Task Parallel Library, TPL),用于简化并行编程。

创建任务:

Task task = new Task(YourMethod);
task.Start();

等待任务完成:

Task.WaitAll(task1, task2);

并行循环:

Parallel.For(0, 100, i => 
{
    // 并行执行的代码
});

3.2 并行 LINQ(PLINQ)

PLINQ 是对 LINQ to Objects 的并行实现,可以显著提高数据处理的性能。

PLINQ 查询:

var query = from num in numbers.AsParallel()
           where num % 2 == 0
           select num;

3.3 同步上下文(SynchronizationContext)

同步上下文用于确保在正确的线程上执行回调。

获取当前同步上下文:

SynchronizationContext context = SynchronizationContext.Current;

发布到同步上下文:

context.Post(state => 
{
    // 在正确的线程上执行的代码
}, state);

4. 线程安全集合

4.1 线程安全集合类

C# 提供了一些线程安全的集合类,可以在多线程环境下安全地使用。

线程安全字典(ConcurrentDictionary):

ConcurrentDictionary<int, string> dict = new ConcurrentDictionary<int, string>();
dict.TryAdd(1, "Value1");
string value;
dict.TryGetValue(1, out value);

线程安全队列(ConcurrentQueue):

ConcurrentQueue<int> queue = new ConcurrentQueue<int>();
queue.Enqueue(1);
int item;
queue.TryDequeue(out item);

4.2 不可变集合

不可变集合是一旦创建就不能修改的集合,可以安全地在多线程间共享。

创建不可变集合:

ImmutableList<int> list = ImmutableList.Create(1, 2, 3);

5. 性能监控与调试

5.1 性能监控

使用性能监控工具可以帮助诊断多线程程序中的性能瓶颈。

性能计数器:

PerformanceCounter counter = new PerformanceCounter("Category", "Counter");
counter.NextValue();

5.2 调试技巧

调试多线程程序需要特殊的技巧和工具。

使用 Visual Studio 调试器:

  • 断点
  • 并行堆栈窗口
  • 并行任务窗口

日志记录:

using (var writer = new StreamWriter("log.txt", true))
{
    writer.WriteLine("Thread {0} is executing.", Thread.CurrentThread.ManagedThreadId);
}

6. 最佳实践与常见问题

6.1 最佳实践

  • 尽量使用线程池来管理线程
  • 避免过度同步
  • 使用异步编程模型来提高响应性和性能

6.2 常见问题

  • 死锁
  • 竞态条件
  • 线程饥饿

通过遵循最佳实践和了解常见问题,可以编写出高效、稳定的多线程程序。

到此这篇关于C# 多线程并发编程基础小结的文章就介绍到这了,更多相关C# 多线程并发编程内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 如何使用C#程序给PDF文件添加编辑域

    如何使用C#程序给PDF文件添加编辑域

    本文主要给大家分享的是通过C#操作PDF类库iTextSharp来实现在在PDF文档中填写日期或签名之类的能编辑的文本域,非常的简单实用,有需要的小伙伴可以参考下。
    2017-01-01
  • C#使用HtmlAgilityPack组件解析html文档

    C#使用HtmlAgilityPack组件解析html文档

    这篇文章介绍了C#使用HtmlAgilityPack组件解析html文档的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • 基于C#实现XML文件读取工具类

    基于C#实现XML文件读取工具类

    这篇文章主要介绍了基于C#实现XML文件读取工具类,涉及C#针对XML文件各节点获取的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • C#实现获取电脑中的端口号和硬件信息

    C#实现获取电脑中的端口号和硬件信息

    这篇文章主要为大家详细介绍了C#实现获取电脑中的端口号和硬件信息的相关方法,文中的示例代码讲解详细,有需要的小伙伴可以参考一下
    2025-01-01
  • c#中WinForm用OpencvSharp实现ROI区域提取的示例

    c#中WinForm用OpencvSharp实现ROI区域提取的示例

    已经自学OpencvSharp一段时间了,现在就分享一下我的学习过程,本文主要介绍了c#中WinForm用OpencvSharp实现ROI区域提取的示例,具有一定的参考价值,感兴趣的可以了解一下
    2022-05-05
  • C# 显示、隐藏窗口对应的任务栏

    C# 显示、隐藏窗口对应的任务栏

    WPF中全屏窗口,会自动隐藏任务栏,那非全屏窗口如何隐藏任务栏?甚至有没有一种场景,隐藏任务后自定义一套系统任务栏来显示?这篇文章主要介绍了C# 显示、隐藏窗口对应的任务栏,需要的朋友可以参考下
    2021-10-10
  • C# 任务的异常和延续处理

    C# 任务的异常和延续处理

    本文主要介绍了C# 任务的异常和延续处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-12-12
  • C# newtonsoft.json中文乱码问号的解决方案

    C# newtonsoft.json中文乱码问号的解决方案

    这篇文章主要介绍了C# newtonsoft.json中文乱码问号的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • C#.NET获取拨号连接的宽带连接方法

    C#.NET获取拨号连接的宽带连接方法

    这篇文章主要介绍了C#.NET获取拨号连接的宽带连接方法,实例演示了一个C#封装的ADSL拨号连接类及其使用方法,需要的朋友可以参考下
    2015-06-06
  • C# 中的委托详细解析与完整应用小结

    C# 中的委托详细解析与完整应用小结

    C#委托是一种类型安全的函数指针,允许将方法作为参数传递或赋值给变量,它在事件处理、回调和异步编程中广泛应用,本文详细介绍了委托的基本概念、用法和高级应用,感兴趣的朋友一起看看吧
    2025-03-03

最新评论