最简单的跨线程调用控件的实例,代码精简,容易理解。一个是同步的invoke委托,一个是异步的begininvoke,最明显的区别就是,invoke会阻断其他子线程操作,用的比较少。比较推荐用begininvoke。wpf一般用dispatcher这个写法比较简单。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WinFormsApp2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public delegate void changeTextHandler(object str);
private void button1_Click(object sender, EventArgs e)
{
Thread td = new Thread(addNum);
td.Start("更新Label");
}
void addNum(object str)
{
while (true)
{
Thread.Sleep(100);
if (textBox1.InvokeRequired == true)
{
changeTextHandler ct = new changeTextHandler(addNum);
textBox1.Invoke(ct, new object[] { str });
}
else
{
textBox1.AppendText("1");
}
}
}
private void button2_Click(object sender, EventArgs e)
{
Thread td = new Thread(addNum2);
td.Start();
}
public void addNum2(object str)
{
while (true)
{
Thread.Sleep(100);
// wpf 可以用以下这种方法,Invoke是同步,BeginInvoke是异步
// this.Dispatcher.BeginInvoke((Action)delegate () { textBox3.AppendText("3"); //新的线程调用 });
if (textBox2.InvokeRequired)
{
//第一种写法
Action<string> actionDelegate = (x) => { textBox2.AppendText("1"); };
//第二种写法
//Action<string> actionDelegate = delegate (string txt) { textBox2.AppendText("1"); };
// 1、Invoke方法是同步的, 它会等待工作线程完成,会阻塞其他子线程
// this.textBox2.Invoke(actionDelegate, str);
//2、BeginInvoke方法是异步的, 它会另起一个子线程去完成工作线程
this.textBox2.BeginInvoke (actionDelegate,str);
}
else
{
textBox2.AppendText("1");
}
}
}
}
}