System.InvalidOperationException: 线程间操作无效: 从不是创建控件“labelControl1”的线程访问它

来源:互联网 发布:网络销售人员业务流程 编辑:程序博客网 时间:2024/06/05 14:07
今天来给大家介绍关于C#异常:线程间操作无效: 从不是创建控件“xxx”的线程访问它的解决办法。
C# WinForm开发中,这是一个比较常见的异常:线程间操作无效,从不是创建控件“xxx”的线程访问它。这个异常来源于.NET2的一个限制:工作线程不能访问窗口线程创建的控件。解决方法主要有两种,一种是在窗口线程中设置CheckForIllegalCrossThreadCalls = false ;另一种方式比较麻烦,使用委托的方式调用Invoke方法。

异常信息:
System.InvalidOperationException: 线程间操作无效: 从不是创建控件“labelControl1”的线程访问它。
在 System.Windows.Forms.Control.get_Handle()
在 System.Windows.Forms.Control.set_WindowText(String value)
在 System.Windows.Forms.Control.set_Text(String value)
在 DevExpress.XtraEditors.LabelControl.set_Text(String value)

第一步:
//声明委托
delegate void SetValueEventHandler(LabelControl label, string text);

第二步:
/// <summary>
/// 设置LabelControl的值
/// </summary>
/// <param name="LabelControl">label控件</param>
/// <param name="text">值</param>
private void SetLabelValue(LabelControl label, string text)
{
// 对于该控件的请求来自于创建该控件所在线程以外的线程
        if (label.InvokeRequired)
        {
var set = new SetValueEventHandler(delegate(LabelControl _label, string _text)
                {
                       _label.Text = _text;
                 });
this.Invoke(set, label, text);
         }
         else
         {
                label.Text = text;
         }
}

第三步:

new Thread(new ThreadStart(delegate()
{
    try {
        // 直接设置会引发异常:线程间操作无效,从不创建控件的线程访问它
        // CheckForIllegalCrossThreadCalls = false;
        // this.button1.Enabled = true;

        // 用委托的方式
        SetLabelValue(LabelControl1,"5000");
    }catch(Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }         
})).Start();


美丽元素返利网(http://www.mlyuansu.com)