关于C#中的Invoke示例详解

 更新时间:2023年02月06日 10:57:58   作者:薪薪代码  
一直对invoke和begininvoke的使用和概念比较混乱,这两天看了些资料,对这两个的用法和原理有了些新的认识和理解,下面这篇文章主要给大家介绍了关于C#中Invoke的相关资料,需要的朋友可以参考下

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( )
{
   /*在Windows窗体应用程序中使用this.Invoke 在WPF应用程序中使用this.Dispatcher.Invoke*/
   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详解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#实现语音播报功能

    C#实现语音播报功能

    这篇文章主要为大家详细介绍了C#实现语音播报功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • C#减少垃圾回收压力的字符串操作详解

    C#减少垃圾回收压力的字符串操作详解

    这篇文章给大家详细分析了C#减少垃圾回收压力的字符串操作的相关知识点,有兴趣的朋友参考学习下吧。
    2018-03-03
  • UGUI绘制动态曲线

    UGUI绘制动态曲线

    这篇文章主要为大家详细介绍了UGUI绘制动态曲线的具体方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • C# OpenCvSharp利用白平衡技术实现图像修复功能

    C# OpenCvSharp利用白平衡技术实现图像修复功能

    这篇文章主要为大家详细介绍了C# OpenCvSharp如何利用白平衡技术实现图像修复功能,文中的示例代码讲解详细,希望对大家有一定的帮助
    2024-02-02
  • unity实现UI元素跟随3D物体

    unity实现UI元素跟随3D物体

    这篇文章主要为大家详细介绍了unity实现UI元素跟随3D物体,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • C# / VB.NET 在PPT中创建、编辑PPT SmartArt图形的方法详解

    C# / VB.NET 在PPT中创建、编辑PPT SmartArt图形的方法详解

    本文介绍通过C#和VB.NET程序代码来创建和编辑PPT文档中的SmartArt图形。文中将分两个操作示例来演示创建和编辑结果,需要的朋友可以参考下
    2020-10-10
  • WPF中NameScope的查找规则详解

    WPF中NameScope的查找规则详解

    这篇文章主要给大家介绍了关于WPF中NameScope的查找规则的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-10-10
  • C#中一些你可能没用过的调试窗口的方法

    C#中一些你可能没用过的调试窗口的方法

    其他窗口比较常用,就不介绍了,是不是有一些你没用到的窗口呢?
    2013-05-05
  • C#超实用代码段合集

    C#超实用代码段合集

    这篇文章主要介绍了C#超实用代码段合集,涉及C#针对图标、数学运算、拼音、日期、时间及文件夹等的相关操作技巧,需要的朋友可以参考下
    2015-11-11
  • C#中如何连接海康威视

    C#中如何连接海康威视

    这篇文章主要介绍了C#中如何连接海康威视问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02

最新评论