怪物奇妙物语

宇宙无敌超级美少男的怪物奇妙物语

首页 新随笔 联系 管理
  819 随笔 :: 0 文章 :: 2 评论 :: 16万 阅读

task 异步任务 任务控制 任务监控 回调

流程图

开始
调用 StartTask 方法
创建 CancellationTokenSource
使用 Task.Run 启动异步任务
任务内部进入 while 循环
是否收到取消请求?
输出“任务正在运行...”
等待 500 毫秒
抛出 OperationCanceledException
输出“任务已被取消”
调用 MonitorTaskStatus 方法
启动新任务监控 _myTask 状态
_myTask 是否完成?
输出当前任务状态
等待 1 秒
输出最终任务状态
在 Main 方法中等待 2 秒
调用 CancelTask 方法
是否已取消?
调用 _cancellationTokenSource.Cancel
输出“正在取消任务...”
跳过取消操作
调用 WaitForTaskToComplete 方法
_myTask 是否为 null?
等待 _myTask 完成
跳过等待
结束

任务代码

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;
}
}
}
posted on   超级无敌美少男战士  阅读(1)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
历史上的今天:
2023-02-22 复杂类型的prop标注 PropType 工具类型:
2022-02-22 读书笔记_吐尽怒气
2022-02-22 读书笔记_清晨叩齿(护齿术)
点击右上角即可分享
微信分享提示