我眼中委托的真正面貌(二)
2009-05-07 08:26:49 来源:WEB开发网确定子线程创建无误,编译也通过了。但是,运行时却出现了这样的错误:
原来,C#中是不支持跨线程操控控件的。不过,出于安全考虑,这样做也是合情合理,这样可以避免多个线程同时操控一个控件所带来的程序运行错误。那么,如何来实现这样的效果呢?
方法一:将 Control.CheckForIllegalCrossThreadCalls 属性设置为 false。你可以尝试给窗体添加Form_Load()事件,然后在事件函数体中对这个属性进行设置。
编译就会发现,程序已经可以顺利执行了。这个方法比较简单,但始终不太安全。所以我们不推荐这样的用法。
方法二:用委托来实现
using System.Threading;
namespace MulTrdDelegate
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//定义委托类型
public delegate void TreadDelgate();
//初始化子线程对象
private Thread demoThread = null;
private void button1_Click(object sender, EventArgs e)
{
demoThread = new Thread(new ThreadStart(ThreadProcUnsafe));
demoThread.Start();
}
public void ThreadProcUnsafe()
{
SetText();
}
private void SetText()
{
string text = "这个控件的内容是由子线程实现的";
if (this.textBox1.InvokeRequired)
{
TreadDelgate Objdelegate = new TreadDelgate(SetText);
this.Invoke(Objdelegate, new object[] {});
}
else
{
this.textBox1.Text = text;
}
}
}
}
更多精彩
赞助商链接