转自:C#中利用委托实现多线程跨线程操作 - 张小鱼 2010-10-22 08:38
在使用VS2005的时候,如果你从非创建这个控件的线程中访问这个控件或者操作这个控件的话就会抛出这个异常。这是微软为了保证线程安全以及提高代码的效率所做的改进,但是也给大家带来很多不便。
其实解决这个问题有两种方法:
一,是通过设置
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
在你的程序初始化的时候设置了这个属性,而且在你的控件中使用的都是微软Framework类库中的控件的话,系统就不会再抛出你上面所说的这个错误了。
二,就是委托了,个人建议用这种方法
首先在WinForm窗体中拖入TextBox控件,然后参照以下代码:
public partial class Form1 : Form
{
private delegate void ThreadWork(int i);//声明委托类型
Thread thread;//声明线程变量
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
this.richTextBox1.Text = "程序开始:\r\n";
UpdateText();
}
public void UpdateText()
{
//创建线程CrossThreadFlush
thread = new Thread(new ThreadStart(CrossThreadFlush));
thread.IsBackground = true;//后台执行线程
thread.Start();//启动线程
}
private void CrossThreadFlush()
{
while (true)
{ //将sleep和无限循环放在等待异步的外面
for (int i = 1; i < 100; i++)
{
ThreadFunction(i);//循环体
Thread.Sleep(500);
}
}
}
private void ThreadFunction(int i)
{
if (this.richTextBox1.InvokeRequired)//等待异步
{
ThreadWork fc = new ThreadWork(ThreadFunction);
// this.Invoke(fc);//不带参数调用方法
//通过代理调用刷新方法//带参数
this.Invoke(fc, new object[1] { i });
}
else
{
this.richTextBox1.Text = string.Format("第{0}个\t{1:mm-ss}\r\n",
i, DateTime.Now) + this.richTextBox1.Text;
this.richTextBox1.Refresh();//控件刷新
}
}
}
}