张德长

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

如何跨线程访问Winform中的UI元素

 如何跨线程访问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);
}
}

 

 

 

posted on   张德长  阅读(188)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示