我们在用线程操作的时候,可能会出现异常:线程间操作无效: 从不是创建控件richTextBox1的线程访问它。因为windows窗体控件不是线程安全的,如果几个线程操作某一控件的状态,可能会使该控件的状态不一致,出现争用或死锁状态。这种情况有以下解决办法:
利用委托机制实现线程安全。这种方法就是微软建议采用的跨线程调用的一种通用方法,就是使用代理来实现,就是将你所要操作的代码放到一个代理中,然后将这个代理交给创建这个控件的线程来执行你的代码。
private delegate void richTextBoxCallBack(); public void SetText(){richTextBoxCallBack callback = delegate()//使用委托{ richTextBox1.AppendText("test");};richTextBox1.Invoke(callback);
}
以上内容摘录:https://www.cnblogs.com/280850911/archive/2012/08/21/2648869.html
完整多线程代码
环境:
程序:WindowsForms(windows窗体)
FW版本:.NET Framework 4.5
完整源码:
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 WindowsFormsAccess_Shift_MSServer
{public partial class Form1 : Form{public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){Task.Run(()=> {this.GetData();});}private delegate void richTextBoxCallBack();private void GetData() {for (int i = 0; i < 99; i++){richTextBoxCallBack richTextBoxCallBack = delegate () {SucceedRichTextBox.AppendText(i + "_行\n");};SucceedRichTextBox.Invoke(richTextBoxCallBack);Thread.Sleep(2000);}}private void label1_Click(object sender, EventArgs e){}}
}