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;
}
}
}
浙公网安备 33010602011771号