C#中的多线程案例

news2024/11/16 10:50:03

使用Task写一个进度条

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 _5.任务
{
    public partial class Form1 : Form
    {
       
        Task task = null;
        // 取消的标识符,专门用来管理Task。CancellationTokenSource对象可以生成CancellationToken
        // CancellationTokenSource对象还可以取消任务
        CancellationTokenSource cts;
        bool isPause = false;  // 是否暂停
        public Form1()
        {
            InitializeComponent();
            // 实例化取消任务的标识
            cts = new CancellationTokenSource();
            // 实例化任务(创建一个分线程)
            task = new Task(new Action<object>(UpdateProgressBar), 0, cts.Token);
        }
​
        private void UpdateProgressBar(object state)
        {
            while (!cts.IsCancellationRequested && !isPause)
            {
                task.Wait(100);
                Invoke(new Action(() =>
                {
                    state = (int)state + 1;
                    if ((int)state <= 100)
                        progressBar1.Value = (int)state;
                    else
                        cts.Cancel();  // 取消任务后,会影响IsCancellationRequested属性
                }));
            }
        }
        private void button1_Click(object sender, EventArgs e)
        {
            task.Start();
        }
​
        private void button2_Click(object sender, EventArgs e)
        {
            isPause = true;
        }
​
        private void button3_Click(object sender, EventArgs e)
        {
            isPause = false;
            cts = new CancellationTokenSource();
            task = new Task(new Action<object>(UpdateProgressBar), this.progressBar1.Value, cts.Token);
            task.Start();
        }
​
        private void button4_Click(object sender, EventArgs e)
        {
            isPause = true;
            cts.Cancel();
        }
    }
}
​

CancellationTokenSource怎么使用

CancellationTokenSource 是.NET中用于异步编程的一个类,它允许你创建一个 CancellationToken,这个令牌可以被传递给异步操作,以便在需要时请求取消操作。以下是 CancellationTokenSource 的基本用法:

创建 CancellationTokenSource

CancellationTokenSource cts = new CancellationTokenSource();

获取 CancellationToken

CancellationTokenSource 实例中获取 CancellationToken,然后将它传递给需要支持取消的异步操作。

CancellationToken token = cts.Token;

传递给异步操作

CancellationToken 作为参数传递给支持取消的异步方法。

await SomeAsyncOperationAsync(token);

请求取消

当你需要取消操作时,调用 CancellationTokenSourceCancel 方法。

cts.Cancel();

处理取消

在异步方法中,检查 CancellationToken 是否被触发,并在需要时处理取消逻辑。

public async Task SomeAsyncOperationAsync(CancellationToken cancellationToken)
{
    try
    {
        while (!cancellationToken.IsCancellationRequested)
        {
            // 执行一些工作
​
            // 定期检查取消请求
            cancellationToken.ThrowIfCancellationRequested();
​
            // 模拟工作延迟
            await Task.Delay(1000);
        }
    }
    catch (OperationCanceledException)
    {
        // 处理取消操作
        Console.WriteLine("Operation was canceled.");
    }
}

完整示例

class Program
{
    static async Task Main(string[] args)
    {
        CancellationTokenSource cts = new CancellationTokenSource();
        CancellationToken token = cts.Token;
​
        // 启动异步操作
        Task asyncOperation = SomeAsyncOperationAsync(token);
​
        // 假设5秒后用户请求取消
        await Task.Delay(5000);
        cts.Cancel();
​
        try
        {
            // 等待异步操作完成或抛出异常
            await asyncOperation;
        }
        catch (OperationCanceledException)
        {
            Console.WriteLine("The operation was canceled.");
        }
    }
​
    static async Task SomeAsyncOperationAsync(CancellationToken cancellationToken)
    {
        for (int i = 0; i < 10; i++)
        {
            Console.WriteLine($"Working... {i}");
            await Task.Delay(1000, cancellationToken);
​
            if (cancellationToken.IsCancellationRequested)
            {
                Console.WriteLine("Cancellation was requested.");
                throw new OperationCanceledException(cancellationToken);
            }
        }
    }
}

SomeAsyncOperationAsync 方法执行一些工作,并定期检查是否收到了取消请求。如果在5秒后调用了 cts.Cancel(),那么 CancellationTokenSource 会发出取消请求,并且异步操作将捕获 OperationCanceledException 异常来处理取消。

使用 CancellationTokenSourceCancellationToken 提供了一种优雅的方式来请求和响应取消操作,使异步编程更加灵活和健壮。

使用Task写一个进度条

using System;
using System.Threading;
using System.Windows.Forms;
​
namespace _2.Thread课堂练习
{
    public partial class Form1 : Form
    {
        Thread t = null; // 线程实例
        bool isCancel = false; // 取消标识
        public Form1()
        {
            InitializeComponent();
​
            t = new Thread(UpdateProgressBar);
            this.button2.Enabled = false;
            this.button3.Enabled = false;
            this.button4.Enabled = false;
        }
​
        private void UpdateProgressBar(object step)
        {
            while (!isCancel && t != null && Convert.ToInt32(step) < 100)
            {
                Thread.Sleep(100);
                step = Convert.ToInt32(step) + 1;
​
                if (Convert.ToInt32(step) <= 100)
                {
                    Invoke(new Action(() =>
                    {
                        progressBar1.Value = Convert.ToInt32(step);
                    }));
                }
                else
                {
                    isCancel = true;
                }
            }
        }
​
        private void button1_Click(object sender, EventArgs e)
        {
            t?.Start(0);
            this.button1.Enabled = false;
            this.button2.Enabled = true;
            this.button4.Enabled = true;
        }
​
        private void button2_Click(object sender, EventArgs e)
        {
            t?.Suspend();
            this.button2.Enabled = false;
            this.button3.Enabled = true;
        }
​
        private void button3_Click(object sender, EventArgs e)
        {
            t?.Resume();
            this.button2.Enabled = true;
            this.button3.Enabled = false;
            this.button4.Enabled = true;
        }
​
        private void button4_Click(object sender, EventArgs e)
        {
            isCancel = true;
            t?.Abort();
            this.button1.Enabled = true;
            this.button2.Enabled = false;
            this.button3.Enabled = false;
            this.button4.Enabled = false;
            t = new Thread(UpdateProgressBar);
            progressBar1.Value = 0;
            isCancel = false;
        }
​
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            isCancel = true;
            t?.Abort();
        }
​
        private void Form1_Load(object sender, EventArgs e)
        {
​
        }
    }
}

注意:Invoke里面不能写卡线程的东西,Invoke里面操作的是主线程里面的东西

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2054134.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【有手就行】:从无到有在win10上用docker搭建svn服务器

前言 之所以要搭建svn服务器&#xff0c;是因为在用docker打包项目时方便&#xff0c;如果没有svn就需要手动拷贝项目到容器内&#xff0c;用svn直接update就可以轻松拿到最新代码&#xff0c;岂不快哉 准备工作 1、先安装docker&#xff0c;请移步 docker安装 2、选择svn-s…

【每日力扣中医养生】力扣2608. 图中的最短环

2608. 图中的最短环 文章目录 【每日力扣&中医养生】力扣2608. 图中的最短环题目描述示例示例 1示例 2 输入输出说明解题思路Python代码复杂度分析总结 【每日力扣&中医养生】力扣2608. 图中的最短环 《黄帝内经》阴阳应象大论篇第五&#xff0c;提到“秋伤于湿&…

Leetcode 209,713,3 滑动窗口 C++实现

Leetcode 209. 长度最小的子数组 问题&#xff1a;给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其总和大于等于 target 的长度最小的子数组 [numsl, numsl1, ..., numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c…

redis 遍渐进式历

1.scan cursor [match pattern] [coutn] [type]:以渐进式的方式进行建的遍历 cursor:是光标 指向当前遍历的位置 设置成0表示当前从0开始获取 math parttern &#xff1a;和keys命令一样的 keys * count: 限制一次遍历能够获取到多少个 元素默认是10 type :这次遍历只想获取…

数据库原理--关系模型简述

目录 一、关系模型研究什么 二、关系模型的三要素 三、关系模型与关系数据库语言的关系 一、关系模型研究什么 一个关系(relation)就是一个表(Table),关系模型就是处理Table的&#xff0c;它由三个部分组成: 描述DB各种数据的基本结构(Table/Relation)描述Table与Table之间…

Docker安装Redis集群记录

redis集群整体的安装效果 备注&#xff1a;本机docker容器的宿主机ip为192.168.0.200&#xff0c;下面的配置全部基于当前IP进行配置&#xff1b; 1 docker镜像下载使用的国内地址 vi /etc/docker/daemon.json{"registry-mirrors": ["https://ustc-edu-cn.mir…

苹果手机怎么还原删除的照片?4个【独门秘籍】都在这里了

苹果手机的拍照功能深受广大用户的喜爱&#xff0c;大家出行旅游也大都选择苹果手机拍照记录&#xff0c;因此手机相册也就成为用户们的【生活回忆录】。但是&#xff0c;我们总是会因为各种各样的原因导致相册里的照片消失不见&#xff0c;对此&#xff0c;我们要怎么还原删除…

《计算机组成原理》(第3版)课后习题答案

第1篇 概 论 1&#xff0e;什么是计算机系统、计算机硬件和计算机软件&#xff1f;硬件和软件哪个更重要&#xff1f; 答&#xff1a;计算机系统&#xff1a;由计算机硬件和软件两部分组成&#xff0c;计算机系统具有接收和存储信息、按程序快速计算和判断并输出处理结果等功…

武汉流星汇聚:亚马逊迎来中国力量,中国卖家推动跨境电商繁荣

随着全球化进程的加速和跨境电商的蓬勃发展&#xff0c;中国卖家正以前所未有的速度和规模涌入亚马逊这一全球领先的电商平台。他们的入驻不仅为亚马逊平台注入了新的活力与多样性&#xff0c;更在全球范围内产生了深远的积极影响与变革。 中国作为世界工厂&#xff0c;拥有庞…

一段式端到端vs两段式端到端,到底哪个好

在智能汽车领域&#xff0c;端到端自动驾驶技术正迅速成为行业焦点&#xff0c;不同的玩家实现路径也有差别。目前主流的端到端智驾方案有两类&#xff1a;一段式和两段式&#xff0c;针对这两种方案优缺点的讨论&#xff0c;也从未停止过。 “两段式”端到端和“一段式”端到端…

遥感之地理农业分区

在前面的文章有介绍关于中国区域进行分区研究的思路&#xff1a; 中国生态地理区划更新和优化 全国一米全要素分类数据集如何得到的&#xff1f;原文赏析&#xff01; 根据不同的研究角度对中国区域进行分区&#xff0c;其结果只是细节不一样&#xff0c;大部分还是差不多的&a…

基于Django框架的图书管理系统,前台采用Bootstrap框架UI,后台EasyUI框架UI

程序开发软件&#xff1a;Pycharm 数据库&#xff1a;mysql 采用技术&#xff1a; Django(一个MVT框架&#xff0c;类似Java的SSM框架) 人生苦短&#xff0c;我用Python&#xff0c;咱们今天就来分享一个用Python语言开发的基于Django框架的图书管理系统吧。项目前台和后台界…

Python酷库之旅-第三方库Pandas(088)

目录 一、用法精讲 371、pandas.Series.sparse.density属性 371-1、语法 371-2、参数 371-3、功能 371-4、返回值 371-5、说明 371-6、用法 371-6-1、数据准备 371-6-2、代码示例 371-6-3、结果输出 372、pandas.Series.sparse.fill_value属性 372-1、语法 372-2…

麒麟系统离线安装docker

随着CentOS全面停服&#xff0c;国产操作系统会慢慢代替centos系统&#xff0c;在后续的项目中&#xff0c;项目部署的环境都必将是国产操作系统&#xff0c;本文就国产操作系统下如何离线安装docker,做下笔记分享 一、材料准备 1、国产操作系统 麒麟10&#xff0c;arm64v8 2、…

爱心商城系统pf

TOC springboot424爱心商城系统pf 第1章 绪论 1.1 课题背景 二十一世纪互联网的出现&#xff0c;改变了几千年以来人们的生活&#xff0c;不仅仅是生活物资的丰富&#xff0c;还有精神层次的丰富。在互联网诞生之前&#xff0c;地域位置往往是人们思想上不可跨域的鸿沟&…

k8s上部署rancher

一、什么事rancher Rancher 是一个 Kubernetes 管理工具&#xff0c;让你能在任何地方和任何提供商上部署和运行集群。 Rancher 可以创建来自 Kubernetes 托管服务提供商的集群&#xff0c;创建节点并安装 Kubernetes&#xff0c;或者导入在任何地方运行的现有 Kubernetes 集…

不小心把回收站的照片删了怎么办?别急,这里有找回方法

在日常的数字生活中&#xff0c;照片无疑是我们记录生活点滴、珍藏美好回忆的重要载体。然而&#xff0c;在整理电脑文件时&#xff0c;一个不小心就可能将珍贵的照片误删&#xff0c;甚至从回收站&#xff08;或称为垃圾箱、废纸篓&#xff09;中彻底清空&#xff0c;让人懊悔…

如何关闭宝塔Linux面板的公网SSL证书?

前言 在安装宝塔Linux面板时&#xff0c;有时会不小心开启了公网SSL证书&#xff0c;导致需要通过HTTPS才能访问面板&#xff0c;如果你希望恢复到HTTP访问&#xff0c;可以通过图形界面和命令行两种方式来关闭SSL证书。本文将详细介绍这两种方法&#xff0c;并帮助你顺利完成…

2-70 基于matlab的三维装载约束下的货物循环取货路径优化模型建立

基于matlab的三维装载约束下的货物循环取货路径优化模型建立。包含文档说明。以配送中心为原点&#xff0c;分派多辆同一规格的货车到n个供应商处取货&#xff0c;最后回到配送中心。要求充分考虑货物车厢中的三维装载位置&#xff0c;确保每个零部件均能成功装载&#xff0c;尽…

AUTOSAR实战干货:NVM模块Block属性配置全解析

AUTOSAR实战干货&#xff1a;NVM模块Block属性配置全解析 前言 本文思维大纲如下&#xff1a; 继小T之前所写到的AUTOSAR NVM模块详细文章《AUTOSAR技术干货&#xff1a;CP NVM介绍与实战经验分享》&#xff0c; 小T今天将基于NVM模块中每个Block的重要属性配置一次性讲解清楚…