首页 > 编程语言 >C# 异步控件 backgroundWorker

C# 异步控件 backgroundWorker

时间:2024-03-24 09:00:10浏览次数:31  
标签:控件 false C# Text Enabled System backgroundWorker 按钮 using

// .net4.8 Winform
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {

        static ManualResetEvent manualResetEvent = new ManualResetEvent(true);  // 暂停线程





        public Form1()
        {
            InitializeComponent();
            button2.Enabled = false;  // Pause 按钮不可用
            button3.Enabled = false;  // Stop  按钮不可用
            toolStripStatusLabel1.Text = "准备就绪";
            
        }

        private void timer1_Tick(object sender, EventArgs e)  // 取现在时间
        {
            //Control.CheckForIllegalCrossThreadCalls = false;
            /// 这句代码就是说在这个类中我们不检查跨线程的调用是否合法(如果没有加这句话运行也没有异常,那么说明系统以及默认的采用了不检查的方式)。
            /// 然而,这种方法不可取。我们查看CheckForIllegalCrossThreadCalls 这个属性的定义,就会发现它是一个static的,也就是说无论我们在项目的什么地方修改了这个值,他就会在全局起作用。
            /// 而且像这种跨线程访问是否存在异常,我们通常都会去检查。如果项目中其他人修改了这个属性,那么我们的方案就失败了,我们要采取另外的方案。
            DateTime dateTime = DateTime.Now;
            label2.Text = dateTime.ToString("mm:ss");
            
        }





        public static int T;  // 返回任务数值

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)  // 任务安排
        {
            BackgroundWorker worker = sender as BackgroundWorker;
            Control.CheckForIllegalCrossThreadCalls = false;

            for (int i = 0; i < 101; i++)
            {
                T = i;
                //Task.Delay (100).Wait();
                Thread.Sleep(100);  // 延迟, 毫秒
                worker.ReportProgress(i);  // 报告任务状态, 接受 int 值
                manualResetEvent.WaitOne();   // 等待接受 manualResetEvent 信号.
                
                if (worker.CancellationPending) // 如果用户取消了任务就跳出; 每次执行都判断一次.
                {
                    e.Cancel = true;
                    return;
                } 
            }
            button1.Enabled = true;  // Pause 按钮可用
            button2.Enabled = false;  // Pause 按钮不可用
            button3.Enabled = false;  // Stop  按钮不可用
            //progressBar1.Value = 0;
            e.Result = T; // 返回计算结果
        }



        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            progressBar1.Value = e.ProgressPercentage;  // 返回 worker.ReportProgress(i) 的值;
            label3.Text = e.ProgressPercentage.ToString();
            //button1.Text = e.ProgressPercentage.ToString();
        }

        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Error != null) // 判断是否有错误, 如果有错误则会提示信息
            {
                toolStripStatusLabel1.Text = "错误" + e.Error.Message;
            }

            if (e.Cancelled)  // 判断是否取消了操作
            {
                toolStripStatusLabel1.Text = "取消操作";
            }
            else // 如果没有错误则会从 e.Result = T 取回返回结果;
            {
                toolStripStatusLabel1.Text = "操作完成";
            }



        }

        private void button1_Click(object sender, EventArgs e)
        {

            
            
            toolStripStatusLabel1.Text = "执行中...";
            MessageBoxButtons buttons = MessageBoxButtons.OK;  // 创建一个按钮
            if (worker.IsBusy) // 判断任务是否在执行中
            {
                manualResetEvent.Reset();  // 暂停线程
                MessageBox.Show("任务正在执行中...", "信息", buttons);
                manualResetEvent.Set(); // // 恢复线程
                //return;
            }
            else
            { 
                button2.Enabled = true;  // Pause 按钮可用
                button3.Enabled = true;  // Stop  按钮可用
                //button1.Enabled = false; // Start 按钮不可用
                worker.RunWorkerAsync();  // 执行 backgroundWorker1_DoWork 事件
            }



        }

        private void button2_Click(object sender, EventArgs e)
        {



            button1.Enabled = false;  // Pause 按钮可用
            
            // 根据按钮名称来分别执行任务, 这样的方式比较笨,也不严谨.
            if (button2.Text=="Pause")
            {
                button3.Enabled = false;  // Stop  按钮不可用
                manualResetEvent.Reset();  // 暂停线程
                button2.Text = "Continue";
                toolStripStatusLabel1.Text = "暂停";
            }
            else if (button2.Text == "Continue") 
            {
                button3.Enabled = true;
                manualResetEvent.Set();     // 继续线程
                button2.Text = "Pause";
                toolStripStatusLabel1.Text = "执行中...";
            }
        }
        
        private void button3_Click(object sender, EventArgs e)
        {
            button1.Enabled = false;  // Pause 按钮可用
            button2.Enabled = false;  // Stop  按钮可用
            worker.WorkerSupportsCancellation = true;  // 是否支持异步取消
            if (worker.IsBusy)
            {
                worker.CancelAsync();
                button3.Text = "Close";
                return;
            }


            Close();  // 关闭窗口
        }
    }
}

## 执行过程

## 添加的控件

标签:控件,false,C#,Text,Enabled,System,backgroundWorker,按钮,using
From: https://www.cnblogs.com/xs-xs/p/18092071

相关文章

  • 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......
  • C语言作业(二)
    1.在数组中查找某个数字#include<stdio.h>intmain(){intarr[]={1,2,3,4,5,6,8,9,10,11};intk=7;intsz=sizeof(arr)/sizeof(arr[0]);//求解数组的元素个数intleft=0;intright=sz-1;while(left<=right){......