Task
2018-09-25 本文已影响6人
落地成佛
1、生命周期
- 创建任务
- 等待运行
- 运行中
- 完成(成功完成,失败完成,取消完成)
2、基本知识
- 创建任务:new Task(),Task.Run(),Task.Factory.StartNew()
- 等待任务完成 Task1.Wait(),Task.WaitAll(),Task.WaitAny()
- 任务完成后执行 Task.WhenAll(),Task.WhenAny(),Task1().ContinueWith()
3、任务取消
3.1、CancellationTokenSource.Cancel()
采用CancellationTokenSource,调用CancellationTokenSource.Cancel()取消任务。在任务中并不会强制取消任务,还需要显示调用取消任务
- 方法一: CancellationTokenSource.Token.ThrowIfCancellationRequested();
- 方法二:CancellationTokenSource.Token.IsCancellationRequested
3.2、任务取消后执行任务
tokenSource.Token.Register(() => { Console.WriteLine("取消任务"); });
3.3、CancellationTokenSource.token传入任务的构造器中
CancellationTokenSource.token传入任务的构造器中时,任务取消后得任务状态是取消状态,否则不传的话是失败状态
4、捕获异常
- 方法一:在wait(),waitAll(),waitAny()中添加异常处理
try
{
Task1.Wait();
}
catch(Exception ex)
{
....
}
- 方法二:使用委托
new Task(() =>
{
try
{
....
}
catch (Exception ex)
{
TaskException?.Invoke(ex);
}
});
4、线性安全
- 锁
- BlockingCollection,ConcurrentQueue(T),ConcurrentStack(T),ConcurrentDictionary(TKey, TValue)