异步编程
大约 4 分钟
异步编程
- 默认情况,一个进程只包含一个线程;
- 线程可以派生其他线程,因此,一个进程可能包含多个线程;
- 异步程序中,程序代码不需要严格按照编写的顺序严格执行;
异步编程模式
基于任务的异步模式 (TAP) -- 推荐
- 该模式使用单一方法表示异步操作的开始和完成。
- TAP 以 System.Threading.Tasks.Task 命名空间中的 System.Threading.Tasks 和 System.Threading.Tasks 类型为基础
- 这些类型用于表示任意异步操作。
基于事件的异步模式 (EAP)
- 需要后缀为Async的方法以及多个事件、事件处理程序委托类型和EventArg派生类型
- 建议新开发中不再使用这种模式。
异步编程模型 (APM) 模式(IAsyncResult 模式)
- 使用 IAsyncResult 接口提供异步行为的旧模型
- 不建议新的开发使用此模式
基于任务的异步模式 (TAP)
async/await 特性的结构
// 调用方法
public void fun()
{
// 调用异步方法
asyncFun();
}
// 异步方法
public async void funAsync()
{
// await表达式
// 用于异步方法内部,指明需要异步执行的任务,一个异步方法可以包含多个await表达式;
await ...;
await ...;
...;
}
异步方法
- 使用async修饰符,async属于上下文关键字;
- 包含一个或多个await表达式;
- 返回类型:
void、Task、Task<T>;
- 异步方法参数可以为任意类型任意数量,不能为out、ref参数;
- 异步方法的名称应该以Async为后缀;
- Lambda表达式和匿名函数也可以作为异步对象
async ( … ) => { … }
异步方法的控制流
- 异步方法可以分成3个部分:await表达式前、await表达式、await表达式后;
- 程序运行到await表达式时将控制返回到调用函数;
- 当await表达式完成时执行后续部分;
await表达式
- await表达式包含await关键字和一个awaitable类型的实例;
- Task类属于awaitable类型,一般只需要Task,即await关键字+Task实例;
取消任务
- 使用 CancellationToken和CancellationTokenSource 对象
- CancellationToken对象包含是否取消任务的信息;
- 拥有CancellationToken的任务将定期检测状态,如果CancellationToken对象的 IsCancellationRequested 属性为true,任务停止并返回;
- CancellationToken是不可逆的,IsCancellationRequested被设置为true就不能再更改;
- CancellationTokenSource对象用于创建可分配给不同任务的CancellationToken对象,持有 CancellationTokenSource 的对象可以调用其Cancel方法将CancellationToken的IsCancellationRequested属性设置为true;
等待任务
在调用方法中同步地等待任务
- Task.Wait( )
- Task.WaitAll( )
- Task.WaitAny( )
在异步方法中异步地等待任务
- Task.WhenAll( )
- Task.WhenAny( )
暂停任务
- await Task.Delay(...)
- Task.Delay不会阻塞线程,线程可以继续处理其他工作
- Task.Delay延迟到期后返回Task对象
在GUI程序程序中执行异步操作
GUI程序是通过消息驱动的,消息被放入到消息泵管理的消息队列中;
Gui程序中使用async/await能够避免消息积压,保持GUI程序响应;
// 将await语句以后的部分安排为等待指定时间后的异步线程上 await Task.Delay ( 10000 ); // 让异步方法在执行后续部分同时返回到调用方法 await Task.Yield ( );
计时器 System.Threading.Timer
计时器在每次时间到期之后,系统会从线程池中的线程上开启一个回调方法,回调方法必须是TimerCallback委托形式;
TimerCallback 委托:public delegate void TimerCallback(object state);
构造函数
- Timer ( TimerCallback callback )
- Timer ( TimerCallback callback, object state, int dueTime, int period )
- Timer ( TimerCallback callback, object state, TimeSpan dueTime, TimeSpan period )
- 参数:
- callback:TimerCallback委托
- state:传入回调方法的参数
- dueTime:调用callback前的延时,设置为Timeout.Infinite则不会启动,设置为0则立即调用
- period:调用callback的时间间隔,设置为Timeout.Infinite则只调用一次
方法成员:改变Timer对象的 dueTime 和 period 参数
- Change ( int dueTime, int period )
- Change ( long dueTime, long period )
- Change ( TimeSpan dueTime, TimeSpan period)
其他计时器
System.Windows.Forms.Timer:用于Windows应用程序,定期把WM_TIMER消息放到程序的消息队列中;
System.Timers.Timer:包含众多成员,每次时间到期都会触发其Elapsed成员事件;
并行循环Parallel.For、Parallel.ForEach
- 并行处理相互独立的迭代。
- 具体重载参见CSDN