使用 CancellationTokenSource 中止 Task

目录

前言:

该示例适用于中止 Task


示例

示例 UI 基本为如下图
界面

示例代码如下

     private CancellationTokenSource _cts;

     /// <summary>
     /// 开始按钮
     /// </summary>
     /// <param name="sender"></param>
     /// <param name="e"></param>
     private async void StartButton_Click(object sender, EventArgs e)
     {
         StartButton.Enabled = false;
         _cts = new CancellationTokenSource();
         var token = _cts.Token;
         try
         {
             var textVal = await Task.Run(() =>
             {
                 var result = default(int);
                 while (true)
                 {
                     if (token.IsCancellationRequested)
                         break;
                     result++;
                     Thread.Sleep(200);
                 }
                 return result;
             });

             TaskTextBox.Text = textVal.ToString();
             MessageBox.Show("完成!");
         }
         catch (Exception ex)
         {
             MessageBox.Show(ex.Message);
         }
         StartButton.Enabled = true;
     }

     /// <summary>
     /// 停止按钮
     /// </summary>
     /// <param name="sender"></param>
     /// <param name="e"></param>
     private void StopButton_Click(object sender, EventArgs e)
     {
         if (_cts != null)
             _cts.Cancel();
     }
CancellationTokenSource 是用于取消异步操作的一种机制,它可以与 CancellationToken 一起使用。以下是使用 CancellationTokenSource 的基本步骤: 1. 创建 CancellationTokenSource 对象。 2. 将 CancellationTokenSource.Token 传递给异步操作的方法,使其可以监视取消请求。 3. 在需要取消异步操作时,调用 CancellationTokenSource.Cancel() 方法。 4. 在异步操作的代码中,定期检查 CancellationToken.IsCancellationRequested 属性,以判断是否需要取消操作。 以下是一个简单的示例,演示如何使用 CancellationTokenSource: ```csharp public async Task DoAsyncOperation(CancellationToken cancellationToken) { // 模拟异步操作 await Task.Delay(5000, cancellationToken); // 检查取消标志 if (cancellationToken.IsCancellationRequested) { Console.WriteLine("异步操作已取消。"); return; } Console.WriteLine("异步操作已完成。"); } // 使用 CancellationTokenSource 取消异步操作 public async Task CancelAsyncOperation() { using (var cts = new CancellationTokenSource()) { var task = DoAsyncOperation(cts.Token); // 等待一段时间后取消异步操作 await Task.Delay(2000); cts.Cancel(); try { await task; } catch (OperationCanceledException) { Console.WriteLine("异步操作已取消。"); } } } ``` 在上面的代码中,我们首先创建了一个 CancellationTokenSource 对象,并将其传递给 DoAsyncOperation() 方法。然后,我们等待一段时间后调用 CancellationTokenSource.Cancel() 方法来取消异步操作。最后,我们使用 try/catch 块捕获 OperationCanceledException 异常,以处理取消操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值