主线程var tsk = Task.Factory.StartNew(() =>
{   UI_TabPageItem();});主线程底下动态增加控件
public UI_TabPageItem(string caption, Control displayControl)
{
    ……
    ……
    ……
    Controls.Add(_displayControl);
}
此处会报错 :线程间操作无效: 从不是创建控件“UFrm_Dept”的线程访问它。

解决方案 »

  1.   

    子线程里面访问主线程内容需要 Invoke//在子线程里加 
    this.Invoke(delegate(){
       //你要访问的主线程代码在这里添加
    });
      

  2.   

    上面写错了 特更正如下//在子线程里加 
    this.Invoke(new MethodInvoker(delegate(){
       //你要访问的主线程代码在这里添加
    }));
      

  3.   

    -_-|||task 是并行任务处理,他会自己创建一个线程,即使不用task ,主线程用this.invoke随后在 this.invoke 里动态创建一个控件,然后添加,就会同样涉及到:线程间操作无效!错误。
    以前类似问题通过 BeginInvoke解决掉了,但这次却不好使!
      

  4.   

    加个判断不行么?//在子线程里加 
    if(this.InvokeRequired)
    {
        this.Invoke(new MethodInvoker(delegate(){
           //你要访问的主线程代码在这里添加
        }));
    }
    else
    {
        //直接加
    }
      

  5.   

    BackgroundWorker 貌似要用这个,在研究中……
      

  6.   

    下面是从一个库中摘录出来的,应该能够满足lz的需求。
    ControlDelegate.InvokeMethod  // 跨线程执行控件上的方法.
    ControlDelegate.GetProperty   // 跨线程获取控件上的属性.
    ControlDelegate.SetProperty   // 跨线程设置控件上的属性.
    详情请看下面的代码,完整的,编译成一个lib就可以了。
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Reflection;namespace CommonTools.Control
    {
        /// <summary>
        /// 基于线程安全的控件处理委托类.
        /// </summary>
        public class ControlDelegate
        {
            /// <summary>
            /// <para>基于线程安全的控件方法调用委托.</para>
            /// </summary>
            /// <param name="control">控件实例.</param>
            /// <param name="method">控件方法名.</param>
            /// <param name="value">控件方法入参.</param>
            delegate void InvokeMethodCallBack(System.Windows.Forms.Control control, string method, object value);        /// <summary>
            /// <para>基于线程安全的控件方法调用.</para>
            /// </summary>
            /// <param name="control">控件实例.</param>
            /// <param name="method">控件方法名.</param>
            /// <param name="value">控件方法入参.</param>
            public static void InvokeMethod(System.Windows.Forms.Control control, string method, object value)
            {
                if (control.InvokeRequired == true)
                {
                    InvokeMethodCallBack d = new InvokeMethodCallBack(InvokeMethod);
                    control.Invoke(d, new object[] { control, method, value });
                }
                else
                {
                    Type type = control.GetType();
                    type.InvokeMember(method, BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Instance, null, control, new object[] { value });
                }
            }        /// <summary>
            /// <para>基于线程安全的控件属性获取委托.</para>
            /// </summary>
            /// <param name="control">控件实例.</param>
            /// <param name="property">控件属性名.</param>
            /// <returns></returns>
            delegate object GetPropertyCallBack(System.Windows.Forms.Control control, string property);        /// <summary>
            /// <para>基于线程安全的控件属性获取.</para>
            /// </summary>
            /// <param name="control">控件实例.</param>
            /// <param name="property">控件属性名.</param>
            /// <returns></returns>
            public static object GetProperty(System.Windows.Forms.Control control, string property)
            {
                if (control.InvokeRequired == true)
                {
                    GetPropertyCallBack d = new GetPropertyCallBack(GetProperty);
                    return control.Invoke(d, new object[] { control, property });
                }
                else
                {
                    Type type = control.GetType();
                    return type.InvokeMember(property, BindingFlags.Public | BindingFlags.GetProperty | BindingFlags.Instance, null, control, null);
                }
            }        /// <summary>
            /// <para>基于线程安全的控件属性设置委托.</para>
            /// </summary>
            /// <param name="control">控件实例.</param>
            /// <param name="property">控件属性名.</param>
            /// <param name="value">控件属性设置值.</param>
            delegate void SetPropertyCallBack(System.Windows.Forms.Control control, string property, object value);        /// <summary>
            /// <para>基于线程安全的控件属性设置.</para>
            /// </summary>
            /// <param name="control">控件实例.</param>
            /// <param name="property">控件属性名.</param>
            /// <param name="value">控件属性设置值.</param>
            public static void SetProperty(System.Windows.Forms.Control control, string property, object value)
            {
                if (control.InvokeRequired == true)
                {
                    SetPropertyCallBack CallBack = new SetPropertyCallBack(SetProperty);
                    control.Invoke(CallBack, new object[] { control, property, value });
                }
                else
                {
                    Type type = control.GetType();
                    type.InvokeMember(property, BindingFlags.Public | BindingFlags.SetProperty | BindingFlags.Instance, null, control, new object[] { value });
                }
            }
        }
    }