首页 > 编程语言 >C# GUI_Async_await异步报告

C# GUI_Async_await异步报告

时间:2024-03-24 09:12:28浏览次数:23  
标签:Task C# GUI await Value progress async Async

// .net8环境 Winform
namespace GUI_Async_await异步报告_供参考_
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            progressBar1.Value = 0;
            progressBar2.Value = 0;
            progressBar3.Value = 0;                         // 进度条 恢复初始值.  不然Value的值 一直是100.
            sync();     // 同步方法
        }

        private async void button2_Click(object sender, EventArgs e)   // 注意: 使用 async 的方法需要在 async 方法内调用.
        {
            progressBar1.Value = 0;
            progressBar2.Value = 0;
            progressBar3.Value = 0;                         // 进度条 恢复初始值.  不然Value的值 一直是100.
            progressBar2.Value = await Async();     //  返回执行结果, 注意, 并不是执行过程.   这样的异步方法不会卡在UI界面.   这样的方法适合在后台处理, 直到处理完成再报告结果.
        }

        private async void button3_Click(object sender, EventArgs e)
        {
            progressBar1.Value = 0;
            progressBar2.Value = 0;
            progressBar3.Value = 0;                         // 进度条 恢复初始值.  不然Value的值 一直是100.
            await CallBack();      // 执行异步过程
            
        }

        private async void button4_Click(object sender, EventArgs e)
        {
            progressBar1.Value = 0;
            progressBar2.Value = 0;
            progressBar3.Value = 0;                         // 进度条 恢复初始值.  不然Value的值 一直是100.
            await Step_Report();    // 阶梯式进度条.    如果需要快速调用异步过程方法, 可以试着参考该方法.
        }

        async void More_Async()  // 多个异步方法组合处理
        {
            int[] ints = await Task.WhenAll(Async(), Async());                  // 返回一组任务组, 如果任务组都完成则都返回
            Task<int> Int = await Task.WhenAny(Async(), Async());       // 返回优先完成的任务
            // 注意:如果直接使用方法返回,是无法正确获取任务结果的。 如:  textBox1.Text += Async().IsCompleted;
        }

        // 同步方法
        void sync()
        {
            for (int x = 0; x < 101; x++) { Thread.Sleep(100); progressBar1.Value = x; }
        }

        // 异步方法
        // 如果需要了解到Task方法是否完成, 就需要Task的返回结果.
        // 当然也可以 async void 不需要返回值, 但是这样就不知道执行结果了. 还是根据需求设计.
        async Task<int> Async()
        {
            int result = 0;
            await Task.Run(() =>
            {
                for (int x = 0; x < 101; x++)
                {
                    Thread.Sleep(10);     // 等待0.1秒
                    result = x;                 // 需要知道Task是否完成所以需要一个值来返回.
                }
            });
            return result;                    // 返回结果 

        }



        
        // 异步过程, 会将后台处理的过程显示在UI界面上, 而不影响UI.
        // 需要使用到 IProgress 泛型接口 和 Progress 泛型类,
        async Task Async_Timeout(IProgress<int> progress)        // 这里Task没有指定类型, 默认为null.
        /*  需要注意的是,IProgress<T>.Report 方法可以是异步的。这意味着真正报告进度之前,Async_Timeout 方法会继续运行。
         *  基于这个原因,最好把 T 定义为一个不可变类型,或者至少是值类型。
         *  如果 T 是一个可变的引用类型,就必须在每次调用 IProgress<T>.Report 时, 创建一个单独的副本。*/

        {
            for (int x = 0; x < 101; x++)
            {
                await Task.Delay(10);   // Task.Delay 拥有返回值
                progress.Report(x);      // progress 只有一个Reprot报告的方法.           
            }
        }

        async Task CallBack()
        {
            var progress = new Progress<int>();   // 使用 Progress 泛型类
            /*  Progress<T> 会在创建时捕获当前上下文,并且在这个上下文中调用回调函数。这意味着,
             *  如果在 UI 线程中创建了 Progress<T>,就能在 Progress< T > 的回调函数中更新 UI,即使异
             *  步方法是在后台线程中调用 Report 的。*/

            progress.ProgressChanged += (sender, y) => { progressBar3.Value = y; change_progress(y); };  //  实例化的 Progress 只有一个事件方法, (sender, y) 括号内两个的参数名可以自定义, 但是传参的是 第二个参数
            // var progress = new Progress<int>(change_progress);          // 如果ProgressChanged 太麻烦, 可以使用构造Progress函数填入一个方法即可, 这个方法不需要填入参数, 因为该参数默认指定为Async_Progress的返回值, 但是只能指定一个方法
            await Async_Timeout(progress);
        }

        void change_progress(int y)  // 仅能被CallBack方法调用.
        {
            progressBar1.Value = y;
            progressBar2.Value = y;
        }





        async Task Step_Report()    // 阶梯式进度条
        {
            for (int x2 = 0; x2 < 101; x2 += 20)
            {
                progressBar3.Value = x2;
                if (x2 >= 100) { break; }         // 最后进度条完成 则所有进度条都完成
                for (int x1 = 0; x1 < 101; x1 += 5)
                {
                    progressBar2.Value = x1;
                    for (int x = 0; x < 101; x += 10) { await Task.Delay(10); progressBar1.Value = x; }
                }

            }
        }


    }
}

 ## 执行过程

标签:Task,C#,GUI,await,Value,progress,async,Async
From: https://www.cnblogs.com/xs-xs/p/18092067

相关文章

  • YOLOv9有效改进|加入CVPR2020的Bifpn。
    专栏介绍:YOLOv9改进系列|包含深度学习最新创新,助力高效涨点!!!一、论文摘要        Bifpn是RT-DETR中使用的特征提取模块。二、Bifpn模块详解 2.1模块简介       Bifpn: 重复加权双向特征金字塔网络 。本文用于替换YOLOv9中的FPN+PAN结构。三、 ......
  • EXCEL入门,从认识界面开始
    目录一、工作簿和工作表二、功能区和选项卡三、单元格的名称和内容四、区域及选择方法五、对象和上下文选项卡。         六、问题一:有些工作表为什么找不着?二:我的功能区怎么不见了?三:为什么有些功能我的excel里没有?一、工作簿和工作表整个excel文件称为......
  • C# 异步取消
    //.net8WinformusingSystem;usingSystem.Runtime.InteropServices;usingSystem.Threading.Tasks;usingSystem.Windows.Forms;namespaceAsync_Cancell{publicpartialclassForm1:Form{//[1:使用变量控制进程]//staticboolSto......
  • 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工具本身的命令......