C# Task 模式实现 Demo(含运行、暂停、结束状态)

下面是一个完整的 C# Task 实现示例,包含运行(Running)、暂停(Paused)和结束(Completed)状态控制:

1. 基本实现(使用 CancellationToken 控制)

cs 复制代码
using System;
using System.Threading;
using System.Threading.Tasks;

public class TaskStateDemo
{
    private CancellationTokenSource _cts;
    private PauseTokenSource _pts;
    private Task _task;
    private bool _isRunning;

    public enum TaskStatus
    {
        NotStarted,
        Running,
        Paused,
        Completed,
        Canceled
    }

    public TaskStatus CurrentStatus { get; private set; } = TaskStatus.NotStarted;

    // 启动任务
    public void Start()
    {
        if (_isRunning) return;

        _cts = new CancellationTokenSource();
        _pts = new PauseTokenSource();
        _isRunning = true;
        CurrentStatus = TaskStatus.Running;

        _task = Task.Run(async () =>
        {
            try
            {
                int counter = 0;
                while (!_cts.IsCancellationRequested)
                {
                    Console.WriteLine($"Working... {counter++}");
                    
                    // 检查暂停状态
                    await _pts.Token.WaitWhilePausedAsync();
                    
                    await Task.Delay(1000, _cts.Token); // 模拟工作
                }
                CurrentStatus = TaskStatus.Completed;
            }
            catch (OperationCanceledException)
            {
                CurrentStatus = TaskStatus.Canceled;
            }
            finally
            {
                _isRunning = false;
            }
        }, _cts.Token);
    }

    // 暂停任务
    public void Pause()
    {
        if (!_isRunning || CurrentStatus == TaskStatus.Paused) return;
        
        _pts?.Pause();
        CurrentStatus = TaskStatus.Paused;
        Console.WriteLine("Task paused");
    }

    // 恢复任务
    public void Resume()
    {
        if (!_isRunning || CurrentStatus != TaskStatus.Paused) return;
        
        _pts?.Resume();
        CurrentStatus = TaskStatus.Running;
        Console.WriteLine("Task resumed");
    }

    // 停止任务
    public async Task StopAsync()
    {
        if (!_isRunning) return;
        
        _cts?.Cancel();
        await (_task ?? Task.CompletedTask);
        Console.WriteLine("Task stopped");
    }
}

// 暂停令牌实现
public class PauseTokenSource
{
    private volatile TaskCompletionSource<bool> _paused;
    public PauseToken Token => new PauseToken(this);

    public bool IsPaused => _paused != null;

    public void Pause()
    {
        if (_paused == null)
            Interlocked.CompareExchange(ref _paused, new TaskCompletionSource<bool>(), null);
    }

    public void Resume()
    {
        while (true)
        {
            var tcs = _paused;
            if (tcs == null) return;
            if (Interlocked.CompareExchange(ref _paused, null, tcs) == tcs)
            {
                tcs.SetResult(true);
                break;
            }
        }
    }

    public Task WaitWhilePausedAsync()
    {
        var cur = _paused;
        return cur != null ? cur.Task : Task.CompletedTask;
    }
}

public struct PauseToken
{
    private readonly PauseTokenSource _source;
    public PauseToken(PauseTokenSource source) => _source = source;

    public bool IsPaused => _source?.IsPaused ?? false;
    
    public Task WaitWhilePausedAsync() => 
        _source?.WaitWhilePausedAsync() ?? Task.CompletedTask;
}
  1. 使用示例
cs 复制代码
class Program
{
    static async Task Main(string[] args)
    {
        var demo = new TaskStateDemo();
        
        Console.WriteLine("Starting task...");
        demo.Start();
        
        await Task.Delay(3000);
        Console.WriteLine($"Status: {demo.CurrentStatus}");
        
        Console.WriteLine("Pausing task...");
        demo.Pause();
        await Task.Delay(2000);
        Console.WriteLine($"Status: {demo.CurrentStatus}");
        
        Console.WriteLine("Resuming task...");
        demo.Resume();
        await Task.Delay(3000);
        Console.WriteLine($"Status: {demo.CurrentStatus}");
        
        Console.WriteLine("Stopping task...");
        await demo.StopAsync();
        Console.WriteLine($"Final Status: {demo.CurrentStatus}");
    }
}
  1. 输出示例
cs 复制代码
Starting task...
Working... 0
Working... 1
Working... 2
Status: Running
Pausing task...
Task paused
Status: Paused
Resuming task...
Task resumed
Working... 3
Working... 4
Working... 5
Status: Running
Stopping task...
Final Status: Canceled
  1. 高级实现(带状态变更事件)
cs 复制代码
public class AdvancedTaskStateDemo : TaskStateDemo
{
    public event EventHandler<TaskStatus> StatusChanged;
    
    private new TaskStatus CurrentStatus
    {
        get => base.CurrentStatus;
        set
        {
            base.CurrentStatus = value;
            StatusChanged?.Invoke(this, value);
        }
    }

    public new void Start()
    {
        base.Start();
        CurrentStatus = TaskStatus.Running;
    }

    public new void Pause()
    {
        base.Pause();
        CurrentStatus = TaskStatus.Paused;
    }

    public new void Resume()
    {
        base.Resume();
        CurrentStatus = TaskStatus.Running;
    }

    public new async Task StopAsync()
    {
        await base.StopAsync();
        CurrentStatus = _cts.IsCancellationRequested ? 
            TaskStatus.Canceled : TaskStatus.Completed;
    }
}

5.高级应用:

cs 复制代码
using System;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        var taskController = new AdvancedTaskStateDemo();
        
        // 订阅状态变更事件
        taskController.StatusChanged += (sender, status) => 
        {
            Console.ForegroundColor = GetStatusColor(status);
            Console.WriteLine($"[事件通知] 任务状态变更为: {status}");
            Console.ResetColor();
        };

        // 1. 启动任务
        Console.WriteLine(">>> 启动任务");
        taskController.Start();
        await Task.Delay(2500); // 让任务运行2.5秒

        // 2. 暂停任务
        Console.WriteLine("\n>>> 暂停任务");
        taskController.Pause();
        await Task.Delay(2000); // 暂停2秒

        // 3. 恢复任务
        Console.WriteLine("\n>>> 恢复任务");
        taskController.Resume();
        await Task.Delay(3000); // 运行3秒

        // 4. 停止任务
        Console.WriteLine("\n>>> 停止任务");
        await taskController.StopAsync();

        // 5. 尝试在停止后恢复(应无效)
        Console.WriteLine("\n>>> 尝试在停止后恢复");
        taskController.Resume(); // 不会有任何效果
    }

    private static ConsoleColor GetStatusColor(TaskStateDemo.TaskStatus status)
    {
        return status switch
        {
            TaskStateDemo.TaskStatus.Running => ConsoleColor.Green,
            TaskStateDemo.TaskStatus.Paused => ConsoleColor.Yellow,
            TaskStateDemo.TaskStatus.Completed => ConsoleColor.Blue,
            TaskStateDemo.TaskStatus.Canceled => ConsoleColor.Red,
            _ => ConsoleColor.White
        };
    }
}
  1. 高级应用输出:

>>> 启动任务

Working... 0

事件通知 任务状态变更为: Running

Working... 1

Working... 2

>>> 暂停任务

Task paused

事件通知 任务状态变更为: Paused

Working... 3

>>> 恢复任务

Task resumed

事件通知 任务状态变更为: Running

Working... 4

Working... 5

>>> 停止任务

Task stopped

事件通知 任务状态变更为: Canceled

>>> 尝试在停止后恢复

事件通知 任务状态变更为: Running

相关推荐
昂好的day1 小时前
VisionMaster(VM) 标定工具详解(上):为什么必须标定 + 九点标定手眼标定
开发语言·数码相机·c#
小羊没烦恼!6 小时前
深入浅出SQL Server中的死锁
java·开发语言·前端·数据库·后端·spring·c#
czhc114007566315 小时前
同值短路与单一真值源:属性不是命令,状态只有一个家
c#
下页、再停留19 小时前
【C#桌面客户端系列学习-15】生成可视化图表之折线图、柱状图、饼状图
开发语言·c#
波力海苔夹心脆6751 天前
VisionMaster 两级位置修正实战:塑料外壳与金属件装配角度检测
经验分享·计算机视觉·c#·visionmaster·海康机器人·位置修正
小羊没烦恼!1 天前
C#综合揭秘——Entity Framework 并发处理详解
java·开发语言·前端·javascript·数据库·mysql·c#
淡海水1 天前
05-02-源码-Boehm GC标记阶段
算法·unity·c#·游戏引擎·gc
信可维1 天前
AI 读 Word 表格总读错?先查合并单元格和表头这 3 处
开发语言·人工智能·c#·word·软件工程
半摆烂日常1 天前
手机表单的左滑操作:触摸事件的处理细节
大数据·开发语言·人工智能·智能手机·https·c#
绛橘色的日落(。・∀・)ノ1 天前
C#学习笔记
笔记·学习·c#