怪奇物语

怪奇物语

首页 新随笔 联系 管理

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

流程图

graph LR classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px A([开始]):::startend --> B(调用 StartTask 方法):::process B --> C(创建 CancellationTokenSource):::process C --> D(使用 Task.Run 启动异步任务):::process D --> E(任务内部进入 while 循环):::process E --> F{是否收到取消请求?}:::decision F -- 否 --> G(输出“任务正在运行...”):::process G --> H(等待 500 毫秒):::process H --> E F -- 是 --> I(抛出 OperationCanceledException):::process I --> J(输出“任务已被取消”):::process D --> K(调用 MonitorTaskStatus 方法):::process K --> L(启动新任务监控 _myTask 状态):::process L --> M{_myTask 是否完成?}:::decision M -- 否 --> N(输出当前任务状态):::process N --> O(等待 1 秒):::process O --> M M -- 是 --> P(输出最终任务状态):::process B --> Q(在 Main 方法中等待 2 秒):::process Q --> R(调用 CancelTask 方法):::process R --> S{是否已取消?}:::decision S -- 否 --> T(调用 _cancellationTokenSource.Cancel):::process T --> U(输出“正在取消任务...”):::process S -- 是 --> V(跳过取消操作):::process R --> W(调用 WaitForTaskToComplete 方法):::process W --> X{_myTask 是否为 null?}:::decision X -- 否 --> Y(等待 _myTask 完成):::process X -- 是 --> Z(跳过等待):::process Y --> AA([结束]):::startend Z --> AA

任务代码


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 2025-02-22 08:00  超级无敌美少男战士  阅读(57)  评论(0)    收藏  举报