控件在不同线程中的通信
在.net中,如果在不同的线程中访问控件将会出现错误。例如:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
/// <summary>
/// Caculate Thread
/// </summary>
private void ThreadCaculate(object i)
{
SetTB(i.ToString());
}
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btCaculate_Click(object sender, EventArgs e)
{
string i = "Caculating";
Thread caculateThr = new Thread(new ParameterizedThreadStart(ThreadCaculate));
caculateThr.Start(i);
}
/// <summary>
/// set tbCaculate
/// </summary>
/// <param name="i"></param>
private void SetTB(string i)
{
this.tbCaculate.Text = i;
}
}
在上面的程序中,我们在ThreadCaculate线程中访问了主线程中的tbCaculate(TextBox控件),因此程序会Cross-thread operation not valid的错误。
解决该问题的方法是使用Invoke方法。该方法有两个个重载方法,Invoke(delegate method),Invoke(delegate method,params object[] args)。
因此我们可以添加一个代理
private delegate void SetTBMethodInvoker(string i);
然后修改SetTB(string i)方法
private void SetTB(string i)
{
if (this.InvokeRequired)
{
this.Invoke(new SetTBMethodInvoker(SetTB), i);
}
else
{
this.tbCaculate.Text = i;
}
}
从上面可以看出,解决不同线程访问控件的问题分为两步1.创建delegate 2.执行Invoke方法
posted on 2010-04-29 13:34 These days 阅读(265) 评论(1) 编辑 收藏 举报