C#子线程怎么通过事件来更新UI界面,而不使用委托呢?

shaoming01 2012-05-10 03:53:02
如题,
...全文
615 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
请叫我卷福 2012-05-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

那就用BackgroundWorker吧,在ReportProgress事件里更新界面,我一般都是这样干的。
[/Quote]

这个也是异步的 偶尔也会抛出异常

如果楼主想不使用委托的话 尝试设置属性 Control.CheckForIllegalCrossThreadCalls = false; 当然,这个解决不了问题,只有编译可以通过,运行时偶尔也会抛出异常 所以最后使用委托
Easy2HJ 2012-05-11
  • 打赏
  • 举报
回复
也不是不得行,在主线程里把要操作界面的控件实例传到子线程去,在子线程里就可以直接使用,但是内存受不了哦。
mabaolin 2012-05-11
  • 打赏
  • 举报
回复
可以直接赋值,就是偶尔会抛异常数据更新不了。
  • 打赏
  • 举报
回复
只能用委托
shaoming01 2012-05-11
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
也不是不得行,在主线程里把要操作界面的控件实例传到子线程去,在子线程里就可以直接使用,但是内存受不了哦。
[/Quote]
此方法也需要通过委托来操作控件的,

不过我对你后面的话比较感兴趣,我以前确实有这么做,直接将主form对象传递给其他对象,然后在其他对象里直接操作主form,
我知道这样做是不对的,但是请教一下这个真会很占内存什么的吗?我个人认为只是传了一个引用过去而已应该不怎么会占内存的.
shaoming01 2012-05-10
  • 打赏
  • 举报
回复
呵呵,可能我记错了,我原以为C#里有一种事件,子线程引发,主线程接受完了就可以直接操作UI,而不需要委托,不过我现在已经委托了.
void user_NewQueryChanged(object sender, NewQueryEventArgs e)
{
Config.SaveData();
if (this.InvokeRequired)
{
this.BeginInvoke((MethodInvoker)delegate(){ResetViews(((User)sender).KeywordList, e);});
}
else
{
ResetViews(((User)sender).KeywordList, e);
}
}
wangsong145 2012-05-10
  • 打赏
  • 举报
回复
不使用委托的话楼主通过设置这个属性试试:

Control.CheckForIllegalCrossThreadCalls = false;
Saleayas 2012-05-10
  • 打赏
  • 举报
回复
事件需要委托来表示。
NewUser2008 2012-05-10
  • 打赏
  • 举报
回复
那楼主自己开发一个语言。就可以实现!
指间的风 2012-05-10
  • 打赏
  • 举报
回复
不使用委托,怎么同步呢?

子线程执行完了,不委托,找谁更新呢?
effun 2012-05-10
  • 打赏
  • 举报
回复
那就用BackgroundWorker吧,在ReportProgress事件里更新界面,我一般都是这样干的。
bdmh 2012-05-10
  • 打赏
  • 举报
回复
就用委托

110,538

社区成员

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

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

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