在我们开发软件时经常会需要跟新界面上的某个控件来显示相关的信息。
当我们的界面需要在程序运行中不断更新数据时,当一个textbox的数据需要变化时,为了让程序执行中不出现界面卡死的现像,最好的方法就是多线程来解决
一个主线程来创建界面,使用一个子线程来执行程序并更新主界面,这样就不会出现卡死的现像了,这肯定是没有问题的,但是,我们会发现如果我们在子线程中去变动一个不是在这个线程中创建的控件的时候,系统会报错,这个时候我们就需要使用到委托来完成这个操作。
委托是C#编程一个非常重要的概念,网络上经常会有人说委托是什么?代理是什么?区别是什么?
其实委托和代理是同一个概念,只是没有明确的官方同一定义所以,你翻译为委托,我翻译成代理就这么多区别。
delegate 是关键词,【注:EventHandler是一个声明委托的微软C#的命名标准,我的习惯是标准就要第一时间说,也就这个命名习惯要第一时间养成】
完了,这就是委托,就这么简单,看看和我们一般的方法有什么区别呢?
委托类型声明:
(1) 以deleagate关键字开头。
(2)返回类型+委托类型名+参数列表。
言归正传
要实现标题的问题解决;简单的几步就可以
1.定义一个委托;
2.绑定一个方法;
3.子线程中调用执行
代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
namespace ThreadUpdateUI
{
public partial class Form1 : Form
{
Thread myThread;
public delegate void InitMainUI();
InitMainUI myMainUI;
private void initAll()
{
richTextBox1.AppendText("TEST line \r");
}
public Form1()
{
InitializeComponent();
myThread = new Thread(doWork);
myMainUI = new InitMainUI(initAll);
}
private void doWork()
{
for(int i=0;i <10;i++)
{
Thread.Sleep(1000);
//richTextBox1.AppendText("test directly!");
this.Invoke(myMainUI);
Application.DoEvents();
}
}
private void button1_Click(object sender, EventArgs e)
{
myThread.Start();
}
}
}