当前位置:首页 > 代码相关 > 正文内容

C# IProgress接口汇报进度

admin3个月前 (02-18)代码相关163

使用IProgress接口来实现进度的汇报,使用CancellationToken类型的参数实现取消操作。

IProgress接口中只有一个方法,Report方法,用于报告进度更新。Progress类实现了这个接口,这里通过传递委托的方式来更新控件进度。

通过CancellationTokenSource类通知 CancellationToken,告知其应被取消。

下面是一个winform的例子,用到上面说的类和接口,使用异步的方式更新进度条与label。

一共有4个控件,两个button的Name分别叫buttonStart和buttonCancel,一个label的Name是label1,一个ProgressBar的Name是progressBar1

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace _20210217进度条接口
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            progressBar1.Maximum = 100;
            progressBar1.Minimum = 0;
            buttonCancel.Enabled = false;
        }
        CancellationTokenSource cancelSource;
        private async void button1_Click(object sender, EventArgs e)
        {
            cancelSource = new CancellationTokenSource();
            TestClass testClass = new TestClass();

            //进度类,实现了IProgress<T>接口,构造函数的参数是一个Action<T>类型的委托
            Progress<int> progress = new Progress<int>(percent => { label1.Text = percent + "%"; progressBar1.Value = percent; });
            buttonStart.Enabled = false;
            buttonCancel.Enabled = true;
            try
            {
                await Task.Run(() => testClass.DoProcessing(progress, cancelSource.Token));
                label1.Text = "结束";
                buttonStart.Enabled = true;
                buttonCancel.Enabled = false;               
            }
            catch (OperationCanceledException)
            {
                buttonStart.Enabled = true;
                MessageBox.Show("取消了操作!");
            }

        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (cancelSource != null)
                cancelSource.Cancel();
            buttonCancel.Enabled = false;
        }
    }

    class TestClass
    {
        public void DoProcessing(IProgress<int> progress, CancellationToken cancel)
        {
            
            for (int i = 0; i <= 100; ++i)
            {
                cancel.ThrowIfCancellationRequested();
                Thread.Sleep(100);
                if (progress != null)
                {
                    progress.Report(i);                
                }              
            }
            
        }
    }
}

 

版权声明:本文由cyhu's essay发布,如需转载请注明出处。

本文链接:https://lovedm.club/?id=121

相关文章

C# Stack堆栈

Stack代表了一个先入后出的对象集合。有以下常用方法:表 3Clear()从 Stack 中移除所有对象。Contains(Object)确定某元素是否在 Stack&...

C语言 rename

在<stdio.h>头文件下以下内容来自:http://www.cplusplus.com/reference/cstdio/rename/?kw=renamerenameint ...

C、C++、C#交换变量

C、C++、C#交换变量

最近重新看了看C和C++,觉得有些地方挺有意思。作为一开始不管什么资料都会用来做例子的一个程序,交换变量。不管在哪,常用的int,float,double类型的变量都是值类型的,作为参数传到函数(方法...

C#(或者Java)反转数组

将原数组反转,如[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]反转后变为[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]因为数组是引用类型,所以直接在方法中处理即可,C#和J...

C语言qsort简单使用

qsort函数位于stdlib.h头文件里。是用来排序的函数,函数原型如下:void qsort(void *ptr, size_t count, size_t size, int (*comp)(c...

C#解析JSON

C#解析JSON

首先使用nuget搜索json,如下图选择第一个包安装。然后引用命名空间 using Newtonsoft.Json;以下面的JSON文件为例子解析:{"page":1,"...