C#事件多线程(一)

C#线程基础(线程启动和停止) 通过线程对象的IsBackground属性可以设置线程为前台线程或后台线程。前台线程与后台线程的区别是,后台线程不会使托管程序处于运行状态。也就是说,如果进程停止所有前台线程,那么系统会认为此进程处于非运行状态,将会停止所有后台线程并关闭。创建线程对象的构造方法中使用了ThreadStart()委托,当线程开始执行时,将会执行委托中定义的方法。通过IsBackground属性设置线程为后台线程,适当地使用线程,可以增加程序的运行效率,使程序运行更加流畅,但是线程间的同步问题也显得尤为重要,可以。 阅读详情

事件(Event)

概念

事件是对象在外界第三方因素影响下发生的事情,而对外提供的一种消息机制

事件的两个参与者

  1. 发送者(Sender):对象本身,当本身状态发生变化时,触发事件,并通知事件的接收者

  2. 接收者(Receiver):用来处理事件的,在事件发送者触发一个事件后,会自动执行的内容

事件和委托

相同点:

事件对象本质就是一个私有的委托对象,以及公有的方法,add(+=)和remove(-=)

不同点:

  1. +=方法是,实际上是调用add方法对委托进行添加。

  2. 委托对象私有以后,无法直接从外部赋值(内部可以赋值)。

  3. 好处:能够避免用户直接将对象事件清除,比如微软给内部事件,只允许通过add或者remove进行注册和移除事件,而不能清除掉。这样做能够保护委托。理解事件是对委托的封装

异步编程

同步方法

程序运行的时候,在调用其他方法的时候,会等待被调用的方法按顺序执行完,才会继续执行。非常符合开发思维,有序执行

假如:张三、李四、王麻子、秦七、赵六现在要王者开黑。
问题:张三游戏加载20s
     李四游戏加载30s
     王麻子游戏加载1m
     秦七游戏加载40s
     赵六游戏加载1m20s
最终需要等待焦国栋游戏加载完成才能同时进入游戏
这就是所谓同步编程

例如:银行柜台办理业务,只有一个业务窗口在营业。所有人只能排队等候

异步方法

在程序调用异步方法的时候,主程序不会等待方法执行完,而是主程序调用异步方法后直接继续运行,而异步方法会启动一个新线程来完成方法的计算。

假如:张三、李四、王麻子、秦七、赵六现在测试
问题:张三完成所有题目30m
     李四完成所有题目50m
     王麻子完成所有题目40m
     秦七完成所有题目45m
     赵六完成所有题目1h30m
     考试时间不限的,谁先交卷谁先回家吃饭
不管谁先完成不会影响其他人,五个人之间相互没有任何关系

异步编程

委托的异步调用

  1. 先根据比较耗时的功能方法声明对应的委托

  2. 给委托赋值,赋与这个耗时的功能函数

  3. 采用委托的BeginInvoke方法进行异步调用委托

    Invoke方法:类似于默认的方法调用,相当于直接使用()调用委托 BeginInvoke方法:指采取异步调用委托

  4. 给BeginInvoke方法创建回调函数

    回调函数:回调函数是指,当前的正在执行的操作完成之后,立刻回调用的一个函数是回调函数

    BeginInvoke方法参数组成:

    1. 第一组参数:委托所指向的方法对应的参数

    2. AsyncCallback参数:与当前委托对应的回调函数

    3. object参数:假如回调函数需要参数则由object参数提供

    BeginInvoke方法返回值为IAsyncResult,而委托的回调函数必须有一个参数为IAsyncResult类型

  5. 通过EndInvoke获取对应委托的BeginInvoke的执行结果

  6. 因为BeginInvoke相当于重新创建的线程进行异步调用方法函数,所以回调函数也是异步的线程的执行的,那么异步线程和程序主线程相当于阳关道和独木桥,

    因此如果使用Winform或WPF中的控件要考虑清楚:UI中的控件等都是Winform或WPF主线程中创建的,而异步线程无法直接使用

    设置CheckForIllegalCrossThreadCalls =false,这个属性是用来设置Winform或者WPF中的主线程不在做控件的跨线程检测

    public partial class Form1 : Form
    {
        public Form1()
        {
            CheckForIllegalCrossThreadCalls = false;
            InitializeComponent();
            func1 = Fun1;
        }
        Func<int,int, int> func1;
      
        private void button1_Click(object sender, EventArgs e)
        {
            IAsyncResult result = func1.BeginInvoke(2,10,new AsyncCallback(CallBackFunc),null);
            lbl2.Text =Fun2(10).ToString();
        }
​
        void CallBackFunc(IAsyncResult result)
        {
            this.lbl1.Text= func1.EndInvoke(result).ToString();
        }
​
        int Fun1(int num,int num2)
        {
            System.Threading.Thread.Sleep(5000);//等待5秒钟
            return num * num;
        }
​
        int Fun2(int num)
        {
            return num * num;
        }
    }

 

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#线程(一)概述及常用方法

1. 概述与概念1.1. 入门线程小例子C#支持通过多线程并行地执行代码,一个线程有它独立的执行路径,能够与其它的线程同时地运行。一个C#程序开始于一个单线程,这个单线程是被CLR和操作系统(也称为“主线程”)自动创建的,并具有多线程创建额外的线程。class ThreadTest {       static void Main()      {              Threadt = n...

subin_iecas的博客 1万+

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

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

2401_82410658的博客 1949

C# 的 ManualResetEvent(线程同步操作) 类详解

是用于线程同步操作的类,允许一个或多个线程等待特定信号,以协调多个线程的执行顺序。它通过事件通知机制实现,确保线程在收到信号前保持阻塞,直到其他线程显式发出信号。多个工作线程需要等待某个公共条件(如资源初始化完成)满足后,才能同时开始工作。例如:主线程启动后台任务后需等待其初始化完成,再执行后续操作。:一旦处于终止状态(Signaled),所有等待线程立即释放,直到手动重置。:分阶段任务中,后续阶段需等待前一阶段所有线程完成。:多个工作线程等待某个共享资源(如数据加载完成)。进入阻塞状态,等待初始化完成。

qq_3517289697的博客 2007

C#学习笔记之——委托、线程、事件、lamda表达式

委托的广播和订阅,实现数据传递。带参数的方法需要这样开多线程。Task任务,对线程的封装。Action对委托的封装。delegate委托。

yuejich的博客 1106

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

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

weixin_36289742的博客 1010

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

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

weixin_42513870的博客 927

c# 多线程 执行事件 并发_.NET异步和多线程系列(一)

本系列将和大家分享.Net中的异步多线程,本文是该系列的开篇。首先来看些概念:进程:计算机概念,虚拟的概念,程序在服务器运行时占据全部计算资源的总和,我们给它起个名字叫进程。线程:计算机概念,虚拟的概念,进程在响应操作时最小单位,也包含CPU 内存 网络 硬盘IO。多线程:计算机概念,一个进程有多个线程同时运行。进程与线程的区别:  1、线程是程序执行的最小单位,而进程是操作系统分配...

weixin_39904612的博客 947

40-基于STM32与LD3320的智能语音调光台灯开发全攻略(代码+硬件+调试心得)

本文详细介绍了基于STM32与LD3320的智能语音调光台灯开发全攻略,包括硬件设计、软件实现和调试心得。项目利用STM32单片机控制LD3320语音识别模块,实现语音控制开关和PWM调光功能,适合非接触式操作场景。文章还分享了硬件选型、PWM调光算法优化及常见问题解决方案,为开发者提供完整参考。

weixin_29163797的博客 324

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

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

weilian_wangyu的博客 3427

IWR6843ISK+DCA1000EVM 本人遇到的所有报错和解决方案

本文详解了初次使用DCA1000EVM和mmave studio遇到的一系列的问题以及解决方法

2301_77883976的博客 3295

手机移动端-纯js浏览器h5调用摄像头扫描识别解析 条形码+二维码

一、场景 h5原生js 浏览器端解决识别二维码条形码功能; 不借助Hbuilder.需要自己打包成APP,比如用Hbuilder打包,浏览器端项目h5无打包成app部署X不采用 不借助微信扫一扫,调用微信js-jdk有多麻烦,还要认证服务号,也不适用其它浏览器打开X不采用 二、思路 1.思路一:input(相机拍照)+条形码或二维码识别js支持库 通过h5-input[camera]调用相机进行拍照成图片,通过条形码等识别库解析出数据; <input @cha...

徐子厚的博客 3万+

c# 带返回值的action_C#委托事件机制:委托的用法(3)

感谢刘铁猛老师的《C#入门详解》和擅码网Monkey老师的《C#面向对象基础》本专栏的委托与事件部分已经更新完毕,跳转链接如下:第一篇:感性认识委托感性认识委托 - 褚星痕的文章 - 知乎 https://zhuanlan.zhihu.com/p/146341073第二篇:函数指针:委托的由来函数指针:委托的由来 - 褚星痕的文章 - 知乎 https://zhuanlan.zhihu.com/p...

weixin_27153203的博客 1782

MCP4728 电路及stm32F103程序移植

写在前面 通过优快云查到一些MCP4728 的程序,结合程序及datasheet对于驱动的描述,理清了思路 感谢开路者! MCP4728的电路比较简单,见下文描述 应用电路 datasheet: 实际测试电路: SCL接stm32的PB10,SDA接PB11 RDY/BSY引脚和LDCA引脚,悬空 解释见截图: MCP4728地址 选择任意输出通道写入DAC输入寄存器 应用程序 int mcp4728_write_all_channel(float vol1, float vol2, fl

u013074298的专栏 5422

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

BL0910-从零到一:多路交/直流电能计量的实战配置与校准

本文详细介绍了BL0910芯片在多路交直流电能计量中的实战应用。从硬件连接、SPI通信配置,到软件初始化、核心寄存器设置,再到偏置与增益校准,提供了完整的配置与校准指南。文章重点阐述了直流测量模式的切换要点及数据读取的工程化处理,帮助开发者快速实现高精度、多通道的电能监控方案。

rice5的博客 560

PSINS惯性系初始对准与代码解读

本文参考“摇摆基座上基于信息的捷联惯导粗对准研究”(秦永元),以及“严恭敏博士后研究报告”,详细解读并推导了静基座惯性系对准算法,并与PSINS代码进行对照解读。

u011012050的博客 6752

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

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

Sayesan的专栏 1501

2022年全国职业院校技能大赛 高职组大数据技术与应用卷⑦——解析答案

大数据时代,电商经营模式发生很大改变。在传统运营模式中,缺乏数据积累,人们在做出一些决策行为过程中,更多是凭借个人经验和直觉,发展路径比较自我封闭。而大数据时代,为人们提供一种全新的思路,通过大量的数据分析得出的结果将更加现实和准确。商家可以对客户的消费行为信息数据进行收集和整理,比如消费者购买产品的花费、选择产品的渠道、偏好产品的类型、产品回购周期、购买产品的目的、消费者家庭背景、工作和生活环境、个人消费观和价值观等。通过数据追踪,知道顾客从哪儿来,是看了某网站投放的广告还是通过朋友推荐链接,是新访客还是

我是网络安全兼技能大赛工程师,专注网络安全技术学习与技能大赛实战!持续分享最新的技术文章,帮你少走弯路,一起在技术赛道上进步~ 470

C#多线程处理和事件

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

寒冰屋的专栏 774

YOLOv13优化:PoolingFormerCGLU模块 MetaFormer 框架 + 池化混合器 手把手教你自注意力

PoolingFormer1 是一个基于 MetaFormer 框架 的轻量化卷积-Transformer 混合模块,通过 Pooling 取代自注意力,实现: 更低的计算成本 一定的全局信息融合 兼容 CNN 和 Transformer 的优点

FJN110的博客 425

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

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

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

dianyao4740的博客 538

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

C#多线程详解

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

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

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

C#中的委托和事件详解

C#中的委托和事件

m0_45882392的博客 1320

C#多线程 委托事件

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

刘欢的博客 1161

C# 委托和事件

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

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值