多线程中访问主线程控件
form   中,创建一个线程以编程方式创建控件,实例化控件,然后将所创建的控件附到主线程中的panel中,如何实现哦?
------解决方案--------------------simple exmple..   
 private void button2_Click(object sender, EventArgs e) 
         { 
             Thread thread = new Thread(new ThreadStart(ThreadProc)); 
             thread.Start(); 
         } 
         private void ThreadProc() 
         { 
             MethodInvoker mi = new MethodInvoker(AddControls); 
             this.BeginInvoke(mi); 
         } 
         private void AddControls() 
         { 
             TextBox tb = new TextBox(); 
             tb.Name =  "test "; 
             this.panel1.Controls.Add(tb); 
         }
------解决方案--------------------异步委托提供以异步方式调用同步方法的能力。当同步调用一个委托时,“Invoke”方法直接对当前线程调用目标方法。如果编译器支持异步委托,则它将生成“Invoke”方法以及“BeginInvoke”和“EndInvoke”方法。如果调用“BeginInvoke”方法,则公共语言运行库 (CLR) 将对请求进行排队并立即返回到调用方。将对来自线程池的线程调用该目标方法。提交请求的原始线程自由地继续与目标方法并行执行,该目标方法是对线程池线程运行的。如果在对“BeginInvoke”方法的调用中指定了回调方法,则当目标方法返回时将调用该回调方法。在回调方法中,“EndInvoke”方法获取返回值和所有输入/输出参数。如果在调用“BeginInvoke”时未指定任何回调方法,则可以从调用“BeginInvoke”的线程中调用“EndInvoke”。
------解决方案--------------------private void button1_Click(object sender, System.EventArgs e) 
         { 
             this.listView1.SmallImageList = this.imageList1; 
             Thread t = new Thread(new ThreadStart(Add)); 
             t.Start(); 
         }   
         private void Add() 
         { 
             string path = @ "C:\风景\1600_1200 ";   
             DirectoryInfo dir = new DirectoryInfo(path); 
             FileInfo[] fiArr = dir.GetFiles( "*.* "); 
             foreach (FileInfo f in fiArr) 
             { 
                 string fileName = f.FullName; 
                 aHandler a = new aHandler(addItem); 
                 this.Invoke(a,new object[] {fileName}); 
             }               
         }     
         private void addItem(string fileName) 
         { 
                 Image img = GetImage(fileName); 
                 imageList1.Images.Add(img); 
                 ListViewItem item = new ListViewItem(); 
                 item.Text = fileName; 
                 item.ImageIndex = imageList1.Images.Count-1; 
                 listView1.Items.Add(item); 
             Application.DoEvents(); 
         }   
         private Image GetImage(string fileName) 
         { 
             Image img = System.Drawing.Image.FromFile(fileName);  			 
             return img; 
         }