c# 多线程操作Winform控件,只能通过Delegate操作吗?

颜氓 2013-02-28 08:36:34
在Winform开发中,如果在多线程中操作某一个控件的赋值的时候,我一般都是这么写:


//先声明一个委托
public delegate void SetControlTextDelegate(Control control);

//设置控件的方法
public void SetControlText(Control control, string value)
{
if (control.InvokeRequired)
{
//使用委托赋值
control.Invoke(new SetControlTextDelegate((ct, v) => { ct.Text = v; }), new object[] { control, value });
}
else
{
control.Text = value;
}
}


那么问题来了,如果我想在多线程中,再设置控件的“Font”,“Enabled”,“Size”……或者设置向ListView添加ListViewItem之类的…… 岂不每个不同类型的控件、不同类型的属性,我都要写1个Delegate+1个方法?

求教各位大神,你们平时都怎么处理多线程中的控件赋值或操作?
我这种方式是“正道”吗? 请大神们指教,感谢!

...全文
406 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 5 楼 YanMang 的回复:
引用 4 楼 YanMang 的回复:引用 1 楼 caozhy 的回复:如果你听说过Action<>委托类型和Lambda表达式/匿名委托的话,那么,很明显,你就不需要专门定义委托方法了。谢谢老大回复。 Lambda表达式我还真没用过。 请问您平时都怎么处理呢?(如果能有代码示例或参考资料的话,那就更加感激了~~嘿嘿) =>这种方式 我Lambda表达式经常用。……
Lambda表达式基本上也要这样,只是省了委托声明那步
颜氓 2013-02-28
  • 打赏
  • 举报
回复
引用 4 楼 YanMang 的回复:
引用 1 楼 caozhy 的回复:如果你听说过Action<>委托类型和Lambda表达式/匿名委托的话,那么,很明显,你就不需要专门定义委托方法了。谢谢老大回复。 Lambda表达式我还真没用过。 请问您平时都怎么处理呢?(如果能有代码示例或参考资料的话,那就更加感激了~~嘿嘿)
=>这种方式 我Lambda表达式经常用。涉及我一楼的需求,应该怎么处理呢?
颜氓 2013-02-28
  • 打赏
  • 举报
回复
引用 1 楼 caozhy 的回复:
如果你听说过Action<>委托类型和Lambda表达式/匿名委托的话,那么,很明显,你就不需要专门定义委托方法了。
谢谢老大回复。 Lambda表达式我还真没用过。 请问您平时都怎么处理呢?(如果能有代码示例或参考资料的话,那就更加感激了~~嘿嘿)
颜氓 2013-02-28
  • 打赏
  • 举报
回复
引用 2 楼 lp244392323 的回复:
如果只是winform开发的话在启动线程前加上 Control.CheckForIllegalCrossThreadCalls = false;就可以了,不用定义委托。
这种方式不安全的。
  • 打赏
  • 举报
回复
如果只是winform开发的话在启动线程前加上 Control.CheckForIllegalCrossThreadCalls = false;就可以了,不用定义委托。
threenewbee 2013-02-28
  • 打赏
  • 举报
回复
如果你听说过Action<>委托类型和Lambda表达式/匿名委托的话,那么,很明显,你就不需要专门定义委托方法了。
颜氓 2013-02-28
  • 打赏
  • 举报
回复
引用 7 楼 caozhy 的回复:
control.Invoke(new SetControlTextDelegate((ct, v) => { ct.Text = v; }), new object[] { control, value }); => control.Invoke(new Action<Control, string>((ct, v) => { ct.Text = v; }), new……
一语惊醒梦中人!!!我还傻乎乎的声明大量的委托,哈哈!! 感谢老大指点
threenewbee 2013-02-28
  • 打赏
  • 举报
回复
control.Invoke(new SetControlTextDelegate((ct, v) => { ct.Text = v; }), new object[] { control, value }); => control.Invoke(new Action<Control, string>((ct, v) => { ct.Text = v; }), new object[] { control, value }); 然后委托申明去掉

110,531

社区成员

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

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

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