日期:2014-05-17  浏览次数:20774 次

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;就可以了,不用定义委托。
------解决方案--------------------
引用:
引用:引用:如果你听说过Action<>委托类型和Lambda表达式/匿名委托的话,那么,很明显,你就不需要专门定义委托方法了。谢谢老大回复。
Lambda表达式我还真没用过。
请问您平时都怎么处理呢?(如果能有代码示例或参考资料的话,那就更加感激了~~嘿嘿)
=>这种方式  我Lambda表达式经常用。……

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 });
然后委托申明去掉