目录
1.线程创建和启动
1.
Task.Run(Action)
/Task.Run<TResult>(Func<TResult>)
- 功能:在线程池上启动一个任务(最常用的创建方式)
- 特点:自动调度到线程池,返回可等待的
Task
或Task<TResult>
// 无返回值任务 Task task = Task.Run(() => Console.WriteLine("任务执行中")); // 带返回值任务 Task<int> resultTask = Task.Run(() => 1 + 2); int result = await resultTask; // 结果为 3
2.
new Task(Action)
/Task.Start()
- 功能:显式创建任务后手动启动
- 特点:需调用
Start()
才会执行,可指定调度器Task task = new Task(() => Console.WriteLine("手动启动的任务")); task.Start(); // 启动任务 await task;
3.
Task.Factory.StartNew(Action)
- 功能:通过工厂方法创建并启动任务
- 特点:支持更多创建选项(如任务优先级、是否长时间运行)
// 创建长时间运行的任务(可能会创建新线程而非使用线程池) Task longTask = Task.Factory.StartNew( () => { /* 长时间运行的操作 */ }, TaskCreationOptions.LongRunning );
2.任务等待与组合
1.
Task.Wait()
/Task.Wait(int millisecondsTimeout)
- 功能:同步等待任务完成(阻塞当前线程)
- 参数:可选超时时间(毫秒)
Task task = Task.Run(() => Task.Delay(2000));//Delayh创建将在时间结束后完成的任务 bool completed = task.Wait(1000); // 等待1秒,返回是否完成 //也可以之际wait() task.wait();//等待线程执行完毕
2.awat关键字
- 功能:异步等待任务完成(不阻塞当前线程)
- 特点:必须在
async
方法中使用static async Task Main(string[] args) { await Test(); } public static async Task Test() { Task task = Task.Run(() => { while (true) { Thread.Sleep(1000); Console.WriteLine("-----------"); } }); await Task.Delay(5000);//5s过后默认task执行完毕 Console.WriteLine("'''''''''''''''''''''''''"); // 等待1秒,返回是否完成 }
3.
Task.WhenAll(Task[])
- 功能:等待所有任务完成后再继续
- 返回值:一个新任务,完成时包含所有任务的结果(如果是
Task<TResult>
)Task task1 = Task.Run(() => Task.Delay(1000)); Task task2 = Task.Run(() => Task.Delay(2000)); await Task.WhenAll(task1, task2); // 等待两个任务都完成
4.
Task.WhenAny(Task[])
- 功能:等待任一任务完成后就继续
- 返回值:第一个完成的任务
Task taskA = Task.Run(() => Task.Delay(1000)); Task taskB = Task.Run(() => Task.Delay(1500)); Task completedTask = await Task.WhenAny(taskA, taskB); // taskA 先完成
3.任务延续
1.
Task.ContinueWith(Action<Task>)
- 功能:当前任务完成后自动执行延续操作
- 特点:可访问前序任务的状态和结果
Task<int> calcTask = Task.Run(() => 10 * 2); calcTask.ContinueWith(prevTask => { Console.WriteLine($"前序任务结果:{prevTask.Result}"); // 输出 20 }).Wait();
2.延续选项(
TaskContinuationOptions
)
功能:控制延续任务的执行条件(如仅在前序任务成功 / 失败时执行)
Task task = Task.Run(() => { throw new Exception("任务失败"); }); // 仅当前序任务失败时执行 task.ContinueWith(prev => { Console.WriteLine($"捕获异常:{prev.Exception.Message}"); }, TaskContinuationOptions.OnlyOnFaulted);
4.任务取消
1.
CancellationTokenSource
/CancellationToken
功能:优雅地请求取消任务
流程:创建令牌源 → 传递令牌到任务 → 调用
Cancel()
请求取消static async Task Main(string[] args) { CancellationTokenSource cst = new CancellationTokenSource(); await Test(cst.Token); } public static async Task Test(CancellationToken token) { Task task = Task.Run(() => { while (true) { Thread.Sleep(1000); Console.WriteLine("-----------"); } }); await Task.Delay(5000, token);//5s过后默认task执行完毕,关闭线程 Console.WriteLine("'''''''''''''''''''''''''"); }
5.任务状态与信息
1.
Task.Status
功能:获取任务当前状态(枚举
TaskStatus
)常见状态:
Created
(已创建)、Running
(运行中)、RanToCompletion
(完成)、Canceled
(已取消)、Faulted
(出错)Task task = Task.Run(() => Task.Delay(1000)); Console.WriteLine(task.Status); // 输出 Running await task; Console.WriteLine(task.Status); // 输出 RanToCompletion
2.Task.Exception
功能:获取任务执行过程中抛出的异常(仅在任务状态为
Faulted
时有效)Task task = Task.Run(() => { throw new InvalidOperationException("出错了"); }); try { await task; } catch { if (task.Exception != null) { Console.WriteLine(task.Exception.InnerException.Message); } }
6.任务延时
1.
Task.Delay(int millisecondsDelay)
功能:创建一个延迟指定时间后完成的任务(非阻塞)
用途:替代
Thread.Sleep
(Sleep
阻塞线程,Delay
仅暂停任务)Console.WriteLine("开始等待"); await Task.Delay(2000); // 异步等待2秒,不阻塞线程 Console.WriteLine("等待结束");