zoukankan      html  css  js  c++  java
  • C# 关于Invoke

    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线程。代码如下

     1 public delegate void TestDelegateInvoke();
     2 
     3 private void DelegateInvokeMethod()
     4 {
     5         Thread.Sleep(5000);
     6 }
     7 
     8 private void btn_DelegateInvoke_Click(object sender , EventArgs e)
     9 {
    10         TestDelegateInvoke testDelegate = new TestDelegateInvoke(DelegateInvokeMethod);
    11 
    12         testDelegate.Invoke();
    13 }

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

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

     1 public delegate void TestDelegateInvoke();
     2 
     3 private void DelegateInvokeMethod()
     4 {
     5      Thread.Sleep(5000);
     6 }
     7 
     8 private void btn_DelagateInvoke_Click(object sender, EventArgs e)
     9 {
    10      TestDelegateInvoke testDelegate = new TestDelegateInvoke(DelegateInvokeMethod);
    11 
    12      testDelegate();
    13 }

    怎么用?

    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

    对于Delegate的Invoke,我们一般判断这个方法之前,也是做个判断,判断这个委托对象是否为Null,所以更标准的写法如下:

    TestDelegateInvoke testDelegate = new TestDelegateInvoke(DelegateInvokeMethod);
    
     testDelegate?.Invoke();

     

     

  • 相关阅读:
    loj#6433. 「PKUSC2018」最大前缀和(状压dp)
    PKUWC2019游记
    10. Regular Expression Matching
    9. Palindrome Number
    8. String to Integer (atoi)
    7. Reverse Integer
    6. ZigZag Conversion
    5. Longest Palindromic Substring
    4. Median of Two Sorted Arrays
    3. Longest Substring Without Repeating Characters
  • 原文地址:https://www.cnblogs.com/momj/p/14977163.html
Copyright © 2011-2022 走看看