目录
一、介绍
并行编程实际就是同一时间处理不同任务,可分为数据并行性(在不同任务间同时处理相同数据)和任务并行性(同时执行不同的功能),通常使用多线程来实现,可设置线程优先级;
.NET提供了线程的一个抽象机制Task任务,任务允许建立任务间的关系;
注意:同一时刻访问相同数据,容易出现同步问题,要避免同步问题,最好不要在线程之间共享数据,若需要共享数据,需使用同步技术,确保一次只有一个线程访问和改变共享状态,若不注意同步问题,容易出现争用条件和死锁;
通过关键字async和await来使用异步方法、Parallel LINQ(并行LINQ,提供了任务并行性的一个变体)、以及Task相关内容在进阶篇都有介绍,这不再过多讲解:C#基础与进阶扩展合集-进阶篇
二、并行编程
1、Parallel类
- Parallel类是对线程很好的抽象,提供数据和任务并行性;
- 定义了并行的for、foreach、invoke三个静态方法,使用多任务完成作业;
- for方法迭代的顺序没有定义,提供重载版本第三个参数Action<int,ParallelLoopState>,委托方法内可调用ParallelLoopState的Break()或Stop()方法控制中断,以改变循环结果,还提供可初始化的重载(每个线程调用一次);
- foreach方法以异步方式遍历,也没有确定遍历顺序;
- Invoke()静态方法实现并行调用多个方法,该方法允许传递Action委托的数组,无确定顺序;
List<string> list = new() { "111", "222", "333", "444" };
Parallel.ForEach(list, x => Console.WriteLine(x));
Parallel.For(0, 5, i => Console.WriteLine(i));
Parallel.For(0, 10, (i, s) =>
{
if (i % 2 == 0)
{
s.Break();
Console.WriteLine("break now {0}", i);
}
Console.WriteLine(i);
});
Parallel.Invoke(FuncA, FuncB, FuncC);
2、Timer类
常用的两个计时器,System.Threading.Timer类和用于基于XAML应用程序中的Microsoft.UI.Xaml.DispatcherTimer;
1、使用Timer类
构造器传参:
- 参数1:传递一个满足返回void和1个object参数的CallBack;
- 参数2:任意类型对象,用回调方法中的object接收;
- 参数3:指定第一次调用回调方法时的时间段;
- 参数4:指定回调的重复时间间隔