C# 在线程中访问控件,会抛出异常
错误原因:线程间操作无效,从不是创建控件的线程访问此控件。
解决方法:
利用方法:Control.Invoke (Delegate)
思路:
1、定义一个委托类型
2、声明一个此委托类型的 变量
3、在委托调用的方法中实现 访问控件
如下:
1、public void delegate SetControl();
2、public SetControl setControlDelegate;
3、setControlDelegate = new SetControl(SetControlMethod);
4、在线程的回调函数中,调用控件的invoke方法。
注:SetControlMethod 方法需要自己定义,里面执行对控件的操作。
例:
向Form中添加listbox,button控件
namespace ThreadFm1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public delegate void SetControl();
public SetControl setControlDelegate;
public void SetControlMethod()
{
for (int i = 0; i < 6; i++)
{
listBox1.Items.Add("items " + i.ToString() + "= ");
}
}
private void Form1_Load(object sender, EventArgs e)
{
setControlDelegate = new SetControl(SetControlMethod);
}
private void button1_Click(object sender, EventArgs e)
{
Thread myThread = new Thread(ThreadFunction);
myThread.Start();
}
public void ThreadFunction()
{
listBox1.Invoke(setControlDelegate);
}
}
}