比较好的博客文章:
https://www.cnblogs.com/wyt007/p/9486752.html
知识点:
- 创建线程
- 暂停线程
- 线程等待
- 终止线程
- 监测线程状态
- 线程优先级
- 前台线程和后台线程
- 向线程传递参数
- 使用C#中的lock关键字
- 使用Monitor类锁定资源
- 处理异常
- 线程同步-执行基本的原子操作(Interlocked)
- 线程同步-使用Mutex类
- 线程同步-使用SemaphoreSlim类
- 线程同步-使用AutoResetEvent类
- 线程同步-使用ManualResetEventSlim类
- 线程同步-使用CountdownEvent类
- 线程同步-使用Barrier类
- 线程同步-使用ReaderWriterLockSlim类
- 线程同步-使用SpinWait类
- 使用线程池-在线程池中调用委托
- 使用线程池-向线程池中放入异步操作
- 使用线程池-线程池与并行度
- 使用线程池-实现一个取消选项
- 使用线程池-在线程池中使用等待事件处理器及超时
- 使用线程池-使用计时器
- 使用线程池-使用BackgroundWorker组件
- 使用任务并行库-创建任务
- 使用任务并行库-使用任务执行基本的操作
- 使用任务并行库-组合任务
- 使用任务并行库-将APM模式转换成任务
- 使用任务并行库-将EAP模式转换成任务
- 使用任务并行库-实现取消选项
- 使用任务并行库-处理任务中的异常+
- 使用任务并行库-并行运行任务
- 使用任务并行库-使用TaskScheduler配置任务的执行
- 处理问题:线程死锁状态下处理
在解释死锁如何发生以及如何阻止死锁的过程中,你似乎遇到了问题。
当两个( 最小二) 线程试图获取已经被另一个锁锁定的资源的锁时,就会发生死锁。 线程 1锁定资源 1尝试获取对资源 2的锁定。 同时,线程 2对资源 2有一个锁,它尝试获取对资源 1的锁。 两个线程永远不会放弃锁,因此发生死锁。
避免死锁的最简单方法是使用超时值。 Monitor类( system.threading.monitor ) 可以在获取锁期间设置超时。
例子
1
2
3
4
5
6
7
8
9
10
11
|
if (Monitor.TryEnter( this , 500)) { //critical section } catch (Exception ex) { } finally { Monitor.Exit(); } |
Thread 类常用的属性和方法
下表列出了 Thread 类的一些常用的 属性:
属性 | 描述 |
---|---|
CurrentContext | 获取线程正在其中执行的当前上下文。 |
CurrentCulture | 获取或设置当前线程的区域性。 |
CurrentPrinciple | 获取或设置线程的当前负责人(对基于角色的安全性而言)。 |
CurrentThread | 获取当前正在运行的线程。 |
CurrentUICulture | 获取或设置资源管理器使用的当前区域性以便在运行时查找区域性特定的资源。 |
ExecutionContext | 获取一个 ExecutionContext 对象,该对象包含有关当前线程的各种上下文的信息。 |
IsAlive | 获取一个值,该值指示当前线程的执行状态。 |
IsBackground | 获取或设置一个值,该值指示某个线程是否为后台线程。 |
IsThreadPoolThread | 获取一个值,该值指示线程是否属于托管线程池。 |
ManagedThreadId | 获取当前托管线程的唯一标识符。 |
Name | 获取或设置线程的名称。 |
Priority | 获取或设置一个值,该值指示线程的调度优先级。 |
ThreadState | 获取一个值,该值包含当前线程的状态。 |
下表列出了 Thread 类的一些常用的 方法: