task 异步任务 任务控制 任务监控 回调
流程图
任务代码
| |
| using System; |
| using System.Threading; |
| using System.Threading.Tasks; |
| |
| class Program |
| { |
| private static Task _myTask; |
| private static CancellationTokenSource _cancellationTokenSource = new CancellationTokenSource(); |
| |
| static async Task Main() |
| { |
| |
| StartTask(); |
| |
| |
| await Task.Delay(3000); |
| CancelTask(); |
| |
| |
| await WaitForTaskToComplete(); |
| |
| Console.WriteLine("程序结束"); |
| } |
| |
| |
| static void StartTask() |
| { |
| _myTask = Task.Run( |
| async () => |
| { |
| try |
| { |
| while (!_cancellationTokenSource.Token.IsCancellationRequested) |
| { |
| Console.WriteLine("任务正在运行..."); |
| await Task.Delay(500); |
| } |
| _cancellationTokenSource.Token.ThrowIfCancellationRequested(); |
| } |
| catch (OperationCanceledException) |
| { |
| Console.WriteLine("任务已被取消"); |
| } |
| }, |
| _cancellationTokenSource.Token |
| ); |
| |
| |
| MonitorTaskStatus(); |
| } |
| |
| static void MonitorTaskStatus() |
| { |
| Task.Run(() => |
| { |
| while (!_myTask.IsCompleted) |
| { |
| Console.WriteLine($"任务状态: {_myTask.Status}"); |
| Thread.Sleep(1000); |
| } |
| Console.WriteLine($"任务最终状态: {_myTask.Status}"); |
| }); |
| } |
| |
| static void CancelTask() |
| { |
| if (!_cancellationTokenSource.IsCancellationRequested) |
| { |
| _cancellationTokenSource.Cancel(); |
| Console.WriteLine("正在取消任务..."); |
| } |
| } |
| |
| static async Task WaitForTaskToComplete() |
| { |
| if (_myTask != null) |
| { |
| await _myTask; |
| } |
| } |
| } |
| |
| |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
2023-02-22 复杂类型的prop标注 PropType 工具类型:
2022-02-22 读书笔记_吐尽怒气
2022-02-22 读书笔记_清晨叩齿(护齿术)