C#事件多线程(二)

C# 多线程详细讲解 C# 多线程详细讲解 一、基本概念 1、进程 首先打开任务管理器,查看当前运行的进程: 从任务管理器里面可以看到当前所有正在运行的进程。那么究竟什么是进程呢? 进程(Process)是Windows系统中的一个基本概念,它包含着一个运行程序所需要的资源。一个正在运行的应用程序在操作系统中被视为一个进程,进程可以包括一个或多个线程。 线程是操作系统分配处理器时间的基本单元,在进程中可以有多个线程同时执行代码。进程之间是相对独立的,一个进程无法访问另一个进程的数据(除非利用分布式计算方式),一个进程运行的失败 阅读详情

异步编程总结

  1. 异步编程是建立在委托基础上的一种编程方法

  2. 异步调用的每个方法都是独立的线程执行。因此。本质上就是一种多线程程序,也可以说是一种简化版本的多线程技术

  3. 比较适合在后台运行较为耗时的简单任务,并且任务要求相互独立,任务中不应该有代码直接访问可视化控件

  4. 如果后台任务要求必须按照特定顺序执行,或者必须访问公共资源,则异步编程不适合,而直接使用多线程技术

多线程的异步

    
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
​
        private void button1_Click(object sender, EventArgs e)
        {
            int a = 0;
            //多线程编程
            //委托:ParameterizedThreadStart
            Thread objThread1 = new Thread(() =>
            {
                for (int i = 0; i < 10; i++)
                {
                    a += i;
                    //控件的属性:作用是用来判断当前控件所在的使用环境是创建这个控件的线程(false)还是其他线程(true)
                    if (label1.InvokeRequired)
                    {
                        //控件的Invoke方法:方法中的第一个参数返回值为void的委托,第二个参数是给委托对应方法传递的参数
                        label1.Invoke(new Action<string>(s =>
                        {
                            label1.Text = $"【{s}】";
                        }), a.ToString());
                    }
                    Thread.Sleep(500);
                }
            });
            objThread1.Start();
        }
        private void button2_Click(object sender, EventArgs e)
        {
            int a = 0;
            Thread objThread02 = new Thread(() =>
            {
                for (int i = 0; i < 100; i++)
                {
                    a += i;
                    if (label2.InvokeRequired)
                    {
                        label2.Invoke(new Action<int>(s =>
                        {
                            label2.Text = $"【{s}】";
                        }), a);
                        System.Threading.Thread.Sleep(200);
                    }
                }
            });
            objThread02.Start();
        }
    }

如果创建的子线程未执行完成,当主线程关闭时,这时候会抛异常

这个错误的原因是:当主线程关闭时主线程中的labal2对象也跟着被释放了,而子线程中还依然在使用label2对象,子线程使用时发现label2没了,因此抛了这样一个异常

如果按照程序设计来分析:主线程都关闭了,对应的其下的子线程都要跟着关闭。

新的问题:主线程关闭,子线程如果未完成则没有关闭

解决方法:将程序中的子线程设置为后台线程则只要前台线程都关闭了,则后台线程自动关闭

后台线程

指的是程序中的一些功能不需要和一般线程同时执行,或者这些功能对于UI界面中显示方面要求不高,可以设置为后台线程

例如:VS工具中的,编译检测功能就是后台线程,当VS启动起来,除过前台线程给我们展示编辑菜单等界面,同时后台运行了检测程序

多线程

概念

  1. 进程:每一个独立的程序都是进程。操作系统有《进程管理模块》,管理同时运行的多个程序

  2. 进程和线程:一个进程可以有若干个线程

[http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html]:

句柄(Handle)

句柄是一个标识符,用于代表操作系统中的各种资源,比如各种窗体、GDI绘图对象、进程和线程对象、文件等都用句柄

句柄使用

  1. 即使进程退出,很多时候操作系统仍然保持进程句柄,操作系统句柄有限,使用用需要节省,比如打开文件后,使用完毕要及时关闭

  2. 句柄可以通过Process对象的Handle属性访问,比如进程退出的代码,时间等

总结:拥有图形界面的程序都有一个主窗体,这个窗体也对应有一个句柄。当窗体关闭时进程也关闭。主窗体一般由主线程负责创建

C#多线程,事件,延迟执行的方法 在上述代码中,当按钮的Click事件被触发时,它会等待5秒钟(通过调用Task.Delay(5000)),然后再调用OnOtherEvent方法触发另一个事件。在匿名方法中,使用Task.Delay方法延迟5秒后,执行后续代码。在上述代码中,Task.Delay(5000)会在5秒后返回一个Task对象,然后使用await关键字等待该Task完成后,才会执行后续代码。在上述代码中,Task.Delay(5000)会在5秒后返回一个Task对象,然后使用Wait方法等待该Task完成后,才会执行后续代码。 阅读详情

相关推荐

C# 实现中国象棋游戏大厅及多线程和事件委托

在C#中,事件是一种特殊的多播委托,主要用于实现发布/订阅模式,允许对象或类通知其他对象关于发生的事情。一个事件的声明通常包括一个委托类型和一个访问器,事件的访问器声明了何时允许订阅者进行订阅或取消订阅。// 定义一个名为GameStarted的事件在这个例子中,是一个预定义的委托,它有两个参数:一个object类型的sender和一个EventArgs类型的e。事件会在游戏开始时被触发。

weixin_36289742的博客 1010

线程间的通信与同步

线程间的通信与同步

小胜爱捣鼓 1126

C#中实现多线程委托的具体指南

本文还有配套的精品资源,点击获取 简介:在C#编程中,多线程和委托是提高应用程序性能和响应性的关键概念。本文将介绍如何在Windows Forms应用中利用这些概念,以按钮点击事件为例,通过主线程和新建线程分别向listview控件添加数据。内容涵盖线程创建与管理、委托的使用、事件和异步操作,以及如何安全地从多线程中更新UI控件。 1. 多线程概念与C#实现 ...

weixin_42513870的博客 927

C# 事件(Event)

基本上说是一个用户操作,如按键、点击、鼠标移动等等,或者是一些提示信息,如系统生成的通知。应用程序需要在事件发生时响应事件。例如,中断。C# 中使用事件机制实现线程间的通信。

unber的博客 391

详细解析C#多线程同步事件及等待句柄

本篇文章主要介绍了C#多线程同步事件及等待句柄,希望通过本篇的介绍能对常见的线程同步方法有一个整体的认识,有需要的可以了解一下。

【AAAI 2025】轻量级特征增强新范式!FCM 模块助力小目标检测,即插即用提升模型泛化能力

本文介绍了AAAI 2025提出的轻量级特征增强新范式FCM模块,它通过显式分离并双向交互语义与空间特征,有效解决了小目标检测中特征信息失配的核心难题。该模块设计精巧,计算开销极低,能够即插即用式地嵌入YOLO等主流检测网络,显著提升模型对小目标的泛化检测能力,尤其适用于遥感、自动驾驶等对计算资源敏感的实际场景。

weixin_29056145的博客 287

C#事件多线程(一)

事件(Event) 概念 事件是对象在外界第三方因素影响下发生的事情,而对外提供的一种消息机制 事件的两个参与者 发送者(Sender):对象本身,当本身状态发生变化时,触发事件,并通知事件的接收者 接收者(Receiver):用来处理事件的,在事件发送者触发一个事件后,会自动执行的内容 事件和委托 相同点: 事件对象本质就是一个私有的委托对象,以及公有的方法,add(+=)和remove(-=) 不同点: +=方法是,实际上是调用add方法对委托进行添加。

Cocksuck的博客 4192

使用 Java + PaddleOCR 实现表格识别,支持导出 HTML 和 Excel(附源码)

使用Java+PaddleOCR快速搭建表格识别系统,无需处理底层模型细节。系统支持表格结构识别和内容识别,可将图片转换为可编辑表格格式。文章提供了完整的实现流程,包括Maven依赖引入、模型下载(包含检测、识别、分类和表格结构模型)及参数配置说明。SmartJavaAI支持多种高性能模型选择,适用于不同应用场景,帮助开发者快速实现表格识别功能。

deng775747758的博客 1473

C#_事件_多线程(基础)

多线程就是多个线程同时工作的过程,我们可以将线程看作是程序的执行路径,每个线程都定义了一个独特的控制流,用来完成特定的任务。在多线程中执行的第一个线程称为主线程,当 C# 程序开始执行时,将自动创建主线程,而使用 Thread 类创建的线程则称为子线程,您可以使用 Thread 类的 CurrentThread 属性访问线程。线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。主页有21天速通C#教程欢迎订阅!

2401_82410658的博客 1949

OpenCode:开源代码智能代理平台的全面解析

OpenCode是一个开源代码智能代理平台,采用模块化微服务架构,支持多种AI模型集成。该系统包含前端交互层、代理服务层和模型集成层,提供Build、Plan和General三种代理模式,分别负责代码编写、分析和复杂任务处理。OpenCode支持跨平台安装,具备权限验证、上下文感知等安全机制,并集成LSP协议实现深度代码理解。相比竞品,其开源特性、终端优先设计和提供商无关架构具有明显优势,适用于个人开发、团队协作等多种场景,为开发者提供强大的AI辅助编程能力。

Aaron_945的博客 1423

C#中多线程里面如何调用控件

首先我们在C#中的Winform中经常会遇到多线程的情况,这个时候如果我要对界面进行同步更新,直接在多线程里面调用控件是会报如下的错误: InvaidOperationException,无效的操作异常。 我们从异常中可以读取到:线程间操作无效,从不是创建的控件的线程去访问它。 在clickBtn的点击事件里创建的线程,不能直接调用DoButton方法去操作clickBtn的文本 private v

weilian_wangyu的博客 3427

C++程序发生内存越界,一定会导致程序崩溃吗?详解内存越界

内存越界是否一定会导致程序崩溃吗?详解内存越界

dvlinker的技术专栏 1万+

C# 使用委托实现多线程调用窗体的四种方式

1、方法一:使用线程      功能描述:在用c#做WinFrom开发的过程中。我们经常需要用到进度条(ProgressBar)用于显示进度信息。这时候我们可能就需要用到多线程,如果不采用多线程控制进度条,窗口很容易假死(无法适时看到进度信息)。下面我就简单结合一个我写的例子给大家做一个介绍。 第一步:设计界面,注意需要引用 using System.Threading; 控件名称分别为...

Sayesan的专栏 1501

uniapp:人脸识别功能,已测试,直接复制源码,支持H5,APP安卓。不依赖任何js,SDK。

uniapp人脸识别功能,已测试可直接复制源码,支持H5,APP安卓。不依赖任何js,SDK。 APP效果图:

sunluyi的博客 2225

Bash Shell 系统巡检脚本

部分安全相关检查需要root权限,建议通过sudo运行完整检查。

老韩的Linux云计算架构师进阶之路 94

C#多线程和事件

原文(C# Multithreading and Events):http://www.codeproject.com/Articles/886223/Csharp-Multithreading-and-Events First let’s start off with there is no perfectly safe multithreaded event handling as

每天进步一点点 3427

嵌入式工程师必学(52):储能系统ESS

能量存储系统(ESS,Energystoragesystems)存在于各种各样的尺寸、形状和技术中。储能系统的技术,即基本的储能机制,自然会影响其重要特性,包括成本、安全性、性能、可靠性和寿命。然而,尽管基础技术很重要,但一个成功的储能项目依赖于对该技术的彻底和深思熟虑的实施,以实现项目的目标。成功的实施取决于储能系统的架构和组装情况。系统的体系结构可以决定其性能和可靠性,与它所使用的技术一致,甚至与之无关。

码农17年的博客 1442

C#多线程处理和事件

首先,让我们从没有完全安全的多线程事件处理开始,因为必须处理一些警告/条件。因此,您计划使用的特定方法对于您需要的用途是否安全,这实际上是事实。

寒冰屋的专栏 774

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

C#委托、事件、多线程、Task浅析

前言:最近看Xamarin中默认的项目代码,发现使用了大量的Task类,因此回过头来总结一下C#中委托、事件、多线程、Task在开发中的应用的应用,首先提一句看到一系列博客写的特别好,地址是:http://www.cnblogs.com/sosowjb/archive/2012/08/11/2633953.html 。一共有6篇内容。我这篇主要内容就是总结自己用过的,尽可能写出一些机理...

dianyao4740的博客 538

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

C#多线程详解

上下文切换(Context Switching)是多线程环境中的一种操作,指的是在一个 CPU 核心上切换正在执行的线程,从当前线程的执行上下文(包括寄存器状态、程序计数器等)切换到另一个线程的执行上下文, 线程的切换需要额外的开销,因此在某些情况下,过多的线程可能会导致性能下降。因此,在设计多线程应用程序时,需要考虑如何减少上下文切换的发生,以提高程序的执行效率。是用于实现线程同步的一种机制,用于保护共享资源,避免竞态条件。上下文切换开销指的是从一个线程切换到另一个线程的过程中所涉及的时间和资源开销。

世界既不黑也不白,而是一道精致的灰。 4455

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【超详细】C#事件

本篇文章来从事件的定义、特点、使用步骤等方面对事件进行学习。事件(event)是声明为委托类型的类的成员,允许一个类或对象通知其他类或对象某个特定的事情已经发生。事件基于委托。表示类的偶发行为,一旦这个行为发生,往往要引起其他行为/方法发自动执行。事件是用来实现两个或多个行为的联动调用的。简而言之,事件(关键字event)是声明为委托类型的类的成员变量,是一种特殊的委托。

grapefruit_lyy的博客 1655

C#多线程 委托事件

线程查询数据上传服务器 首先创建一个 声明委托和事件线程 //声明委托与时间 public delegate void UpLoadHandler(DataSet dataset, string type); public event UpLoadHandler UpLoad; /// <summary...

刘欢的博客 1161

C# 委托和事件

委托是一种特殊的类型,用于安全地封装一个或多个方法,并将这些方法作为参数进行传递或调用。委托是方法的引用,可以看作是指向方法的指针。事件是委托的进一步封装,用于在类或对象之间传递消息。事件是类的一部分,通过event关键字声明。

語衣的个人博客 3420

C#中的委托和事件详解

C#中的委托和事件

m0_45882392的博客 1320
上一篇: C#事件多线程(一)
下一篇: C# EF技术
满山猴子
博客等级 码龄7年 48粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值