iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >关于C#中的Invoke示例详解
  • 357
分享到

关于C#中的Invoke示例详解

c#的invokec#中invoke方法详解c# Invoke 2023-02-06 12:02:50 357人浏览 薄情痞子
摘要

目录C# 关于Invoke什么时候用?为什么要用?1、Control的Invoke2、Delegate的Invoke怎么用?1、Control 的 Invoke2、Delegate的

C# 关于Invoke

首先说下,invoke和begininvoke的使用有两种情况:

  • control中的invoke、begininvoke。
  • delegrate中的invoke、begininvoke。 这两种情况是不同的,我们这里要讲的是第1种。下面我们在来说下.net中invoke和begininvoke的官方定义。

control.invoke(参数delegate)方法:在拥有此控件的基础窗口句柄的线程上执行指定的委托。

control.begininvoke(参数delegate)方法:在创建控件的基础句柄所在线程上异步执行指定委托。

invoke的含义是:在拥有此控件的基础窗口句柄的现呈上同步执行指定的委托(同步)
beginInvoke的含义是:在创建控件的基础句柄所在线程上异步执行的委托(异步)

Invoke的本质只是一个方法,方法一定是要通过对象来调用的。

什么时候用?

一般来说,Invoke其实用法只有两种情况:

  • Control的Invoke
  • Delegate的Invoke

也就是说,Invoke前面要么是一个控件,要么是一个委托对象。

为什么要用?

1、Control的Invoke

Control的Invoke一般用于解决跨线程访问的问题,比如你想操作一个按钮button,你就要用button.Invoke,你想操作一个文本label,你就要用label.Invoke.但是大家会发现很麻烦,如果我既然想操作button,又操作label,能不能写在一起呢?有没有更简单的方法呢?

其实主窗体使一个FORM,Form自然也是继承了Control的,所以Form也有Invoke的方法,如果你想省点事,就可以直接调用Form.Invoke,这就是常见的this.Invoke.

为什么有的Invoke前面啥都没有?其实前面是this,只不过省略了.

2、Delegate的Invoke

Delegate的Invoke其实就是从线程池中调用委托方法执行,Invoke是同步的方法,会卡住调用它的UI线程。代码如下

public delegate void TestDelegateInvoke();

private void DelegateInvokeMethod()
{
        Thread.Sleep(5000);
}

private void btn_DelegateInvoke_Click(object sender , EventArgs e)
{
        TestDelegateInvoke testDelegate = new TestDelegateInvoke(DelegateInvokeMethod);

        testDelegate.Invoke();
}

点击按钮运行之后,你会发现UI界面会卡住5秒钟。

当然,委托的调用不是必须要用Invoke方法的,直接调用委托对象也可以。如下所示:

public delegate void TestDelegateInvoke();

private void DelegateInvokeMethod()
{
     Thread.Sleep(5000);
}

private void btn_DelagateInvoke_Click(object sender, EventArgs e)
{
     TestDelegateInvoke testDelegate = new TestDelegateInvoke(DelegateInvokeMethod);

     testDelegate();
}

怎么用?

1、Control 的 Invoke

对于Control 的Invoke ,更标准的用法是先加判断,再调用

if(this.lbl_Value.InvokeRequired)
    {
        this.lbl_Value.Invoke(new Action(()=>
            {
    
                    this.lbl_Value.Text = "测试Invoke";
            }));
    }
    else
      {
                this.lbl_Value.Text = "测试Invoke";
    }

InvokeRequired是Control的一个属性,官方解释为:

获取一个值,该值指示调用方在对控件进行方法调用时是否必须调用 Invoke 方法,因为调用方位于创建控件所在的线程以外的线程中。如果控件的 Handle 是在与调用线程不同的线程上创建的(说明您必须通过 Invoke 方法对控件进行调用),则为 true;否则为 false。

简单来说,就是如果通过多线程去操作这个控件,那么这个属性则为True,否则为False。

2、Delegate的Invoke

通俗的来说就是在一个应用程序的主线程上调用执行指定的委托。主要目的是让工作的线程完成绝大部分的运算工作,将纯粹的界面更新放到UI线程中去完成,达到减轻UI线程负担的目的(避免UI无响应)。

//this.invoke的使用方法
//第一步:定义修改UI的方法
private void ModifyButton( bool _b )
{
   this.Button1.Enabled = _b;
}
//第二步:声明第一步方法的委托
private delegate void ModifyButton_dg( bool _b );
//第三步:调用委托
private void Calldelgate( )
{
   
   this.Invoke( new ModifyButton_dg( ModifyButton ) ,new object[]{false});
}
//第四步:在非UI的线程中调用
  //创建线程 
      Thread _t = new Thread( new ThreadStart( threadmethod )); 
       _t.Start(); 
    //线程入口  
    private void threadmethod () 
     { 
      Calldelgate(); 
     } 

总结

到此这篇关于关于C#中Invoke详解的文章就介绍到这了,更多相关C# Invoke详解内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 关于C#中的Invoke示例详解

本文链接: https://www.lsjlt.com/news/194328.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 关于C#中的Invoke示例详解
    目录C# 关于Invoke什么时候用?为什么要用1、Control的Invoke2、Delegate的Invoke怎么用?1、Control 的 Invoke2、Delegate的I...
    99+
    2023-02-06
    c#的invoke c#中invoke方法详解 c# Invoke
  • 关于C/C++内存管理示例详解
    1、内存分配方式 在C++中,内存分成五个区,分别是堆、栈、自由存储区、静态存储区和常量存储区。 1) 栈 执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这...
    99+
    2022-11-12
  • 关于C#中async/await的用法实例详解
    一直对c#中async/await的用法模模糊糊,不太清晰,今天写了一下Demo彻底明确一下async/await的用法,以免因为对其不了解而对后期的业务产生影响(比如事务导致的锁表...
    99+
    2023-02-08
    C#中async/await的用法 C#中async/await
  • Vue中关于this指向的问题示例详解
    目录由Vue管理的函数不被vue管理的函数this指向大致分类总结在Vue中,方法体里用this调用vue实例的数据,有时会指向window,导致调用失败报错。 由Vue管理的函数 ...
    99+
    2022-11-13
  • 关于C++中二分法详解
    目录一、整数二分1.整数二分模板2.求解二分问题的思路3.练习二、浮点数二分1.浮点数二分模板2.练习三、总结一、整数二分 单调性与二分的关系:有单调性一定可以二分,用二分不一定是单...
    99+
    2022-11-13
  • C# 关于LoadLibrary的疑问详解
    关于 LoadLibrary 的疑问 Win32 API 中 LoadLibrary 函数的功能是加载某个库文件(通常是 dll 文件),然后返回 HMODULE 句柄,可以使用两个...
    99+
    2022-11-12
  • C++数据结构关于栈迷宫求解示例
    目录一、实验目的二、预备知识三、实验内容定义一些代码:定义类类的成员函数的一些说明:找迷宫的方法(dfs算法)主函数(创建对象)运行的一些截图:1.当入口和终点一样时:2.终点是可以...
    99+
    2022-11-12
  • C语言学习之关键字的示例详解
    目录1. 前言2. 什么是关键字3. extern-声明外部符号4. auto-自动5. typedef-类型重定义(类型重命名)6. register-寄存器6.1 存储器6.2 ...
    99+
    2022-11-13
    C语言 关键字
  • C#中的composite模式示例详解
    目录写在前面一个简单例子基层员工类经理类公司架构类客户端代码再想一下使用组合模式进行重构透明型安全型重构后的代码(透明型)写在前面 Composite组合模式属于设计模式中比较热门的...
    99+
    2022-11-13
  • 基于C#实现屏幕取色器的示例详解
    目录实践过程效果代码实践过程 效果 代码 public partial class Form1 : Form { public Form1() { ...
    99+
    2022-12-09
    C#屏幕取色器 C#屏幕取色 C# 取色器
  • C++多态的示例详解
    目录案例一:计算器案例要求代码实现运行效果案例二:制作饮品案例要求代码实现运行效果案例三:电脑组装案例要求代码实现运行效果今天就以三个案例来把C++多态的内容结束。第一个案例就是用多...
    99+
    2022-11-13
  • 关于Linux命令行下的数学运算示例详解
    前言 有几个有趣的命令可以在 linux 系统下做数学运算: expr 、 factor 、 jot 和 bc 命令。 可以在 Linux 命令行下做数学运算吗?当然可以!事实上,有不少命令可以轻松完成这些操作,其中一些...
    99+
    2022-06-04
    linux命令行 linux 命令 数学公式 linux命令行大全
  • C++中register关键字举例详解
    目录register 简介:register 的作用:补充知识:register函数的限制总结register 简介: register 就像是汉语和英语中的形容词(不要问为什么只有...
    99+
    2023-03-08
    cregister关键字 c++ register关键字 c++中的关键字
  • C++中的数据对齐示例详解
    前言 对于C/C++程序员来说,掌握数据对齐是很有必要的,因为只有了解了这个概念,才能知道编译器在什么时候会偷偷的塞入一些字节(padding)到我们的结构体(struct/clas...
    99+
    2022-11-11
  • C++中访问权限的示例详解
    众所周知,C++面向对象的三大特性为:封装,继承和多态。下面我们就先对封装做一些简单的了解。封装是通过C++中的类来完成的,类是一种将抽象转换为用户定义类型的工具。类的定义如下: ...
    99+
    2022-11-12
  • C++基于文件流与armadillo读取mnist示例详解
    前言 发现网上大把都是用python读取mnist的,用C++大都是用opencv读取的,但我不怎么用opencv,因此自己摸索了个使用文件流读取mnist的方法,armadillo...
    99+
    2022-11-12
  • C语言中关于时间复杂度的示例分析
    本篇文章为大家展示了C语言中关于时间复杂度的示例分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、时间复杂度1.什么是时间复杂度?空间效率,时间效率(较为关注)时间复杂度:算法中的操作执行次数,...
    99+
    2023-06-26
  • c++11 类中关于default、explict、implicit、noexcept、final的详解
    default default是c++11的标准,它的作用是告诉编译器声明一个无参的默认构造函数。 最初的时候我们声明类是这样的: class test{ pu...
    99+
    2022-11-12
  • C++中常量与指针的示例详解
    前言 和指针联用有佷微妙的地方,之前一直佷晕,现在来继续研究下。诸如以下: int const; const int; const int* p; int const* p; i...
    99+
    2022-11-12
  • ogg中关于handlecollisions的示例分析
    今天就跟大家聊聊有关ogg中关于handlecollisions的示例分析,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。handlecollisio...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作