首页 > 编程语言 >C# 异步取消

C# 异步取消

时间:2024-03-24 09:00:41浏览次数:37  
标签:异步 Task textBox1 C# Text label3 Stop CancellationTokenSource 取消

// .net8 Winform
using System;
using System.Runtime.InteropServices;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Async_Cancell
{
    public partial class Form1 : Form
    {
        // [ 1: 使用变量控制进程 ]
        // static bool Stop;  // 新建一个布尔值,用于在循环的任务中作为标识。 

        // [ 2:使用 CancellationTokenSource  ]
        static CancellationTokenSource Stop;


        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            button1.Enabled = false;
            button2.Enabled = false;
        }

        private async void button1_Click(object sender, EventArgs e)
        {
            // 初始进度条初始值
            progressBar1.Value = 0;



            //======================================================



            //  [ 1: 使用变量控制进程 ] 。  注意:如果这里调用异步属性Result会报错。   适用简单脚本过程
            // 说明: 如果任务中的标识为true 则跳出循环。  注意:但这并不会终止线程, 这只是跳出了线程的循环而已。
            // Stop = false;        // 停止标识
            // textBox1.Text += tasks1().IsCompleted;  // 因为该方法内部有控件操作,调用该方法会执行该方法。 

            //  [ 2:使用 CancellationTokenSource  ]
            //  说明:该方法和以上似乎差不多, 也是跳出循环。 但是有个问题CancellationTokenSource的值无法恢复默认。 如果使用该类的Cancell方法改变了Token的值, 但却无法恢复为初始。
            // Stop = new CancellationTokenSource();
            // Task t2 = tasks2();                              // 执行任务结果
            // textBox1.Text += "任务是否正常执行:" + AnyDone.IsCompleted + "\r\n";       // 查看任务结果
            // textBox1.Text += "返回任务结果:" + AnyDone.Result + "\r\n";
            // 注意:如果直接使用方法返回,是无法正确获取任务结果的。 如:  textBox1.Text += tasks2().Result.ToString() + "\r\n";



            try
            {
                // 需要获取catch结果需要该方式执行 await  tasks3(Stop.Token);
                Task t3 = tasks3(Stop.Token);
                textBox1.Text += "是否取消了任务:" + t3.IsCanceled + "\r\n";
            }
            catch (OperationCanceledException Ex)
            {
                textBox1.Text += Ex.Message + "\r\n";
            }


            // textbox 自动定位到底部,  注意该语句段需要放在方法的尾部. 因为要作为定位到最后的位置.
            // textBox1.SelectionStart = textBox1.Text.Length;        // 相当于  textBox1.Select(textBox1.Text.Length, 0);
            textBox1.Select(textBox1.Text.Length, 0);
            textBox1.ScrollToCaret();
        }



        /* // [ 1: 使用变量控制进程方法 ]
          async Task tasks1()
          {
              for (int x = 0; x < 101; x++) { if (Stop) { break; } else { await Task.Delay(10); progressBar1.Value = x; } }
          }
          */


        /*        // [ 2:使用 CancellationTokenSource 方法]
                async Task<int> tasks2()
                {
                    int num = 0;
                    for (int x = 0; x < 101; x++)
                    {
                        if (Stop.IsCancellationRequested)
                        { label3.Text = Stop.IsCancellationRequested.ToString(); break; }
                        else
                        { label3.Text = Stop.IsCancellationRequested.ToString(); await Task.Delay(10); progressBar1.Value = x; num = x; }
                    }
                    return num;
                }
        */

        async Task<int> tasks3(CancellationToken tokens)
        {
            int num = 0;
            for (int x = 0; x < 101; x++)
            {
                if (tokens.IsCancellationRequested)
                {
                    tokens.ThrowIfCancellationRequested();    // 触发错误
                    label3.Text = Stop.IsCancellationRequested.ToString();
                }
                else
                {
                    label3.Text = Stop.IsCancellationRequested.ToString();
                    await Task.Delay(10); progressBar1.Value = x; num = x;
                }
            }
            return num;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            // [ 1: 使用变量控制进程方法 ]
            // Stop = true;                   // 停止标识

            // [ 2&3:使用 CancellationTokenSource ]
            Stop.CancelAsync();          // 停止异步

            label3.Text = "True";
        }

        private void button3_Click(object sender, EventArgs e)
        {
            Stop = new CancellationTokenSource();       // 新建CancellationTokenSource对象。 如果使用Cancell方法可以重新生成新对象初始值
            
            button1.Enabled = true;
            button2.Enabled = true;
            label3.Text = "False";
        }


    }
}

## 执行过程

 

标签:异步,Task,textBox1,C#,Text,label3,Stop,CancellationTokenSource,取消
From: https://www.cnblogs.com/xs-xs/p/18092069

相关文章

  • C# 异步控件 backgroundWorker
    //.net4.8WinformusingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Windows.Forms;usingSystem.Threading......
  • AtCoder Beginner Contest 346
    AtCoderBeginnerContest346最刺激的一集。尝试挑战手速极限,用了57s做A。但是好像还是很慢。然后做B,仍然想挑战手速。结果一眼出思路只要把wbwbwwbwbwbw多重复几遍就可以代替「无限长」。很快就写完了。然后交了三发罚时。后来发现我复制若干遍wbwbwwbwbwbw的时候......
  • # c语言程序设计——实验报告二
    实验项目名称:实验报告2数据描述实验项目类型:验证性实验日期:2024年3月21日一、实验目的1、掌握C语言数据类型,熟悉如何定义一个整型、字符型和实型的变量,以及对它们赋值的方法。2、掌握不同数据类型之间赋值的规律。3、学会使用C的有关算术运算符,以及包含这些运算符的......
  • const [increaseBigCats, increaseSmallCats] = useCatStore( (state) => [state.incr
    const[increaseBigCats,increaseSmallCats]=useCatStore((state)=>[state.increaseBigCats,state.increaseSmallCats],shallow);这段代码是在使用zustand这个React状态管理库。zustand提供了一种简洁的方式来创建可复用的状态存储,并允许组件通过hoo......
  • AtCoder Beginner Contest 346
    A-AdjacentProduct(abc346A)题目大意给定\(n\)个数,依次输出相邻俩数的乘积。解题思路按照题意模拟即可。神奇的代码#include<bits/stdc++.h>usingnamespacestd;usingLL=longlong;intmain(void){ios::sync_with_stdio(false);cin.tie(0);c......
  • 工业相机里面图像数据格式mono8,packetedmono10是什么意思,还有color是什么意思?
    mono8,即存储下来的图像为单色,8Bit的图片,一般是bmp,jpeg等。packedmono10,即存储下来的图片为单色,10Bit的图片,但是一般都是存储为16Bit图片,packed存储即将10Bit的数据以16Bit的方式填充,剩余的本应填充为0的6个bit被下一帧图片数据填充,这****样做可以减少数据量和数据冗余度,节省空......
  • eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0 解释
    eslintsrc--extts,tsx--report-unused-disable-directives--max-warnings0解释一下这段命令这段命令是用来运行ESLint工具检查代码的,针对的是src目录下所有.ts和.tsx后缀的TypeScript文件。命令各部分的具体含义如下:eslint:这是执行ESLint工具本身的命令......
  • LeetCode 834. Sum of Distances in Tree
    原题链接在这里:https://leetcode.com/problems/sum-of-distances-in-tree/description/题目:Thereisanundirectedconnectedtreewith n nodeslabeledfrom 0 to n-1 and n-1 edges.Youaregiventheinteger n andthearray edges where edges[i]=[a......
  • Dotnet8运行新问题-he configured user limit (128) on the number of inotify instan
    问题现象:System.IO.IOException:Theconfigureduserlimit(128)onthenumberofinotifyinstanceshasbeenreached,ortheper-processlimitonthenumberofopenfiledescriptorshasbeenreached      解决办法:修改配置:sudovim/......
  • 一文弄懂Javascript中的深拷贝和浅拷贝
    目录一文弄懂Javascript深拷贝与浅拷贝1Javascript数据存储规则2浅拷贝3部分深拷贝3.1Object.assign3.2slice()3.3concat()3.4拓展运算符4完全深拷贝4.1_.cloneDeep()4.2结构化拷贝4.3json.stringify()4.4循环递归4.5jQuery.extend()5总结一文弄懂J......