• C# this.Invoke()的作用和用法(摘)


    Invoke()的作用是:在应用程序的主线程上执行指定的委托。一般应用:在辅助线程中修改UI线程( 主线程 )中对象的属性时,调用this.Invoke();

     
    在多线程编程中,我们经常要在工作线程中去更新界面显示,而在多线程中直接调用界面控件的方法是错误的做法,Invoke 和 BeginInvoke 就是为了解决这个问题而出现的,使你在多线程中安全的更新界面显示。

    正确的做法是将工作线程中涉及更新界面的代码封装为一个方法,通过 Invoke 或者 BeginInvoke 去调用,两者的区别就是一个导致工作线程等待,而另外一个则不会。

    而所谓的“一面响应操作,一面添加节点”永远只能是相对的,使 UI 线程的负担不至于太大而已,因为界面的正确更新始终要通过 UI 线程去做,我们要做的事情是在工作线程中包揽大部分的运算,而将对纯粹的界面更新放到 UI 线程中去做,这样也就达到了减轻 UI 线程负担的目的了。
     

    例如:

    举个简单例子说明下使用方法,比如你在启动一个线程,在线程的方法中想更新窗体中的一个TextBox..

     1 using System.Threading;
     2 namespace test
     3 {
     4   public partial class Form1 : Form
     5   {
     6 
     7  
     8 
     9   public Form1()
    10   {
    11     InitializeComponent();
    12   }
    13   
    14 
    15  
    16 
    17//更新窗体中的TextBox1显示内容的方法
    18 
    19   public void UpdateForm(string param1,string parm2)
    20   {
    21     this.textBox1.Text = param1+parm2;
    22   }
    23 
    24  
    25 
    26//声明委托
    27 
    28  
    29 
    30  
    31 
    32  
    33 
    34   public delegate void  UpdateForm_dl(string str1, string str2);
    35   
    36 
    37//调用委托
    38 
    39   private void Calldelegate()
    40 
    41   {
    42 
    43     /*在Windows窗体应用程序中使用this.Invoke    在WPF应用程序中使用this.Dispatcher.Invoke*/
    44 
    45     this.BeginInvoke(new UpdateForm_dl(UpdateForm), new object[] { "我是文本框", "haha" });
    46 
    47     //this.Dispatcher.BeginInvoke(new UpdateForm_dl(UpdateForm), new object[] { "我是文本框", "haha" });
    48 
    49   }
    50 
    51   
    52//创建新线程
    53 
    54   private void button1_Click(object sender, EventArgs e)
    55   {
    56     Thread thread = new Thread(new ThreadStart(DoWork));
    57     thread.Start();
    58   }
    59 
    60  
    61 
    62//新线程入口
    63 
    64   public void DoWork()
    65 
    66   {
    67      Calldelegate();
    68   }
    69 
    70 
    71   }
    72 }
    View Code

    注意代理的使用!

  • 相关阅读:
    Redis5.x五种数据类型常见命令
    Redis5.x安装以及常见数据类型
    《Redis5.x入门教程》正式推出
    PPT制作套路指南
    如何更优雅地对接第三方API
    软件开发要质量还是要效率?
    前后端分离对于开发人员的挑战
    Spring中老生常谈的FactoryBean
    消费端如何保证消息队列MQ的有序消费
    《ElasticSearch6.x实战教程》之实战ELK日志分析系统、多数据源同步
  • 原文地址:https://www.cnblogs.com/dabexiong/p/5476558.html
Copyright © 2020-2023  润新知