c# 多线程操作Winform控件,只能通过Delegate操作吗?
在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个方法?
求教各位大神,你们平时都怎么处理多线程中的控件赋值或操作?
我这种方式是“正道”吗? 请大神们指教,感谢!
winform
多线程
------解决方案--------------------如果你听说过Action<>委托类型和Lambda表达式/匿名委托的话,那么,很明显,你就不需要专门定义委托方法了。
------解决方案--------------------如果只是winform开发的话在启动线程前加上 Control.CheckForIllegalCrossThreadCalls = false;就可以了,不用定义委托。
------解决方案--------------------
Lambda表达式基本上也要这样,只是省了委托声明那步
------解决方案--------------------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 });
然后委托申明去掉