public partial class Form1 : Form
{
int index = 0;
public Form1()
{
// 方法1
//System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
// 方法2
//using (BackgroundWorker bw = new BackgroundWorker())
//{
// bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
// bw.DoWork += new DoWorkEventHandler(bw_DoWork);
// bw.RunWorkerAsync("Tank");
//}
// 方法3
//Task.Run(() =>
//{
// while (true)
// {
// index++;
// SetAppendTB(this.textBox1, index + "\r\n");
// Thread.Sleep(100);
// }
//});
}
public delegate void SetText(Control tb, string str);
private void SetAppendTB(Control tb, string str)
{
if (tb.InvokeRequired)//判断是不是跨线程 true是 false不是
{
SetText setText = new SetText(SetAppendTB);//实例化委托对象
Invoke(setText, new object[] { tb, str });//线程传递
}
else
{
tb.Text = str;//赋值操作 可自行替换
}
}
void bw_DoWork(object sender, DoWorkEventArgs e)
{
// 这里是后台线程, 是在另一个线程上完成的
// 这里是真正做事的工作线程
// 可以在这里做一些费时的,复杂的操作
Thread.Sleep(5000);
e.Result = e.Argument + "工作线程完成";
}
void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//这时后台线程已经完成,并返回了主线程,所以可以直接使用UI控件了
this.textBox1.Text = e.Result.ToString() + "\r\n";
}
}