如何跨线程访问Winform中的UI元素
假如制作一个Socket聊天应用程序,很可能会用到多线程;
例如为Receive方法开辟单独一个线程,例如为Receive方法开辟单独一个线程(后台运行的线程IsBackGround=true);
然而Winform的UI控件都是运行在主线程中的,如果从其他线程直接访问UI控件,系统就会报错;
public void Show(string s)
{
listBox1.Items.Add(s);
}
那么如何才能在其他线程访问主线程,并且向UI控件传递数据呢?
有两种方法可以选择:
一、用BeginInvoke
public void ShowMessage(string message)
{
BeginInvoke(new Action<string>((msg) => listBox1.Items.Add(msg)), new object[] { message });
}
二、用委托
//声明委托
public delegate void ShowMsg(string s);
//委托要绑定的方法
public void Show(string s)
{
listBox1.Items.Add(s);
}
//在多线程中调用的方法,不会报错的方法
public void ShowMessage(string message)
{
//实例化委托,并绑定方法
ShowMsg OnShowMsg = new ShowMsg(Show);
//如果是跨线程的执行if代码块
if (this.InvokeRequired)
{
this.Invoke(OnShowMsg, message);
}
//如果不是跨线程的,执行else代码块
else
{
Show(message);
}
}
手机扫一扫
移动阅读更方便
你可能感兴趣的文章