求助 C#非主线程调用控件的方法

arthasiori 2010-10-15 04:13:37
小弟学生,正在写个小东西,现在遇到了难题,忘各位大仙解答
在winform FmWait中有一个listbox控件lboxHost
类Client.cs中有一个方法receivedGB()用来接收广播(已有广播),接收到广播新消息就要在lboxHost中显示消息
这个winform加载后启用一个线程,线程执行receivedGB这个方法
现在问题就是线程中的receivedGB这个方法如何才能操作FmWait中的listbox控件呢?
我试了CheckForIllegalCrossThreadCalls = false; 然后在receivedGB中普通的去调用一个FmWait.AddList(string a)方法
来添加可是没反应啊,网上查了查说要用委托,我也尝试的写了些,可是还是不行,希望大哥们帮帮忙啊,谢了先
...全文
188 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
arthasiori 2010-10-15
  • 打赏
  • 举报
回复
如果0代表成功的话,为什么 我的listbox仍然不显示呢,奇怪了。。。
arthasiori 2010-10-15
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wuyq11 的回复:]

private void Form1_Load(System.Object sender, System.EventArgs e)
{
System.Threading.Thread td = new System.Threading.Thread(TEST);
td.Start();
}
public delegate void add();
public void TEST()
……
[/Quote]
我要崩溃,这个大神给的方法我也试了,我写成int a=ListView1.Items.Add("0");
加断点看了,这句返回a是0啊,那就是不成功为啥啊
我按照楼上那几位写的方式也实验了,返回也是0。。。。。。。
wuyq11 2010-10-15
  • 打赏
  • 举报
回复
private void Form1_Load(System.Object sender, System.EventArgs e)
{
System.Threading.Thread td = new System.Threading.Thread(TEST);
td.Start();
}
public delegate void add();
public void TEST()
{
if (ListView1.InvokeRequired == false) {
ListView1.Columns.Add("ID");
ListView1.Items.Add("0");
ListView1.BackColor = Color.Yellow;
ListView1.View = View.Details;
}
else {
add del = new add(TEST);
ListView1.Invoke(del);
}
}
Control.CheckForIllegalCrossThreadCalls = false;
arthasiori 2010-10-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ckp00001 的回复:]

C# code

delegate void SendMessageDelegate(string message);

//在receivedGB中:
this.Invoke (new SendMessageDelegate(SendMessage),new object [] {"hello"});

//在winform中:
void SendMessage(string m)
……
[/Quote]
既不报错,也不执行,this.Invoke()这句代码不会被执行。。。。
zjx198934 2010-10-15
  • 打赏
  • 举报
回复
刚忙过来! 三楼的的很直观了!
ckp00001 2010-10-15
  • 打赏
  • 举报
回复

delegate void SendMessageDelegate(string message);

//在receivedGB中:
this.Invoke (new SendMessageDelegate(SendMessage),new object [] {"hello"});

//在winform中:
void SendMessage(string m)
{
FmWait.AddList(string m);
}

a82344626 2010-10-15
  • 打赏
  • 举报
回复

private delegate void DTest();
private void Test()
{
//操作主界面
}

private void Test1()//非主线程操作
{
this.Invoke(new DTest(Test);
}
arthasiori 2010-10-15
  • 打赏
  • 举报
回复
楼上大哥能否说详细一点呢,象征性的写两行代码好不?? 小弟菜鸟一个
zjx198934 2010-10-15
  • 打赏
  • 举报
回复
先定义一个委托
然后在初始化方法中给这个委托类型的变量赋一个方法(有参数没参数都可以)
最后在你处理的线程中调用listbox.Invoke(委托变量) 即可

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧