我们在用线程操作的时候,可能会出现异常:线程间操作无效: 从不是创建控件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)
{
}
}
}