多线程操作FORM控件的问题
我用C#写的WINDOW   FORM的应用程序,其中使用了多个线程,由于线程的逻辑比较复杂,我使用了类来封装这些逻辑代码,然后调用,这其中我遇到了几个疑惑的问题,请教各位,谢谢,我在写这个程序之前从来没用过C#,而用MFC。 
 1、我在FORM1.CS的类里建立了几个PUBLIC的函数,我在线程类中怎样调用到这些函数?总不能去NEW   FORM1()吧?也不能建立一个STATIC的函数啊? 
 2、其次在线程类的代码中怎样给FORM中的控件赋值或者获取属性?由于无法访问到FORM.CS中的函数,自然也无法获取到控件的类了,很疑惑这个问题,难道真的要每次都要将这个控件传递给类的构造函数? 
 3、我在多个线程中都要对FORM的控件进行操作,怎样避免同时访问的问题?在C#中没有LOCK的功能?
------解决方案--------------------使用委托: 
 主线程: 
 第一步:定义委托delegate 
 private delegate void setConn(string strConn); 
 private setConn mySetConn = null; 
 第二步:定义一个方法 
 private void DispText(string strConn) 
 { 
     textBox1.Text = strConn; 
 } 
 第三步:初始化委托 
 mySetConn = new setConn(this.DispText); 
 第四步:在工作线程中 
 this.Invoke(mySetConn,  "把我显示在textBox1中,谢谢! ");
------解决方案--------------------TO:其次在线程类的代码中怎样给FORM中的控件赋值或者获取属性?   
 楼上几位也提到了,用Invoke..   
 举个例子,比如你在启动一个线程,在线程的方法中想更新窗体中的一个TextBox..   
 类似:   
 using System.Threading;   
 //启动一个线程 
 Thread thread=new Thread(new ThreadStart(DoWork)); 
 thread.Start();   
 //线程方法 
 private void DoWork() 
 { 
     //其他操作 
     //比如将界面的TextBox内容设置一下 
     this.TextBox1.Text= "我是一个文本框 "; 
 }   
 如果你像上面操作,在VS2005里是会有异常的...   
 正确的做法是用Invoke..   
 改为如下: 
 //定义一个委托 
 public delegate void MyInvoke(string str); 
 //更新界面的方法 
 private void UpdateTextBox(string str); 
 { 
      //更新 
      this.TextBox1.Text=str; 
 }   
 //启动一个线程 
 Thread thread=new Thread(new ThreadStart(DoWork)); 
 thread.Start();   
 //线程方法 
 private void DoWork() 
 { 
     //其他操作 
     //比如将界面的TextBox内容设置一下 
     MyInvoke mi=new MyInvoke(UpdateTextBox); 
     this.BeginInvoke(mi,new object[]{ "我是一个文本框 "}); 
 } 
------解决方案--------------------TO:我在多个线程中都要对FORM的控件进行操作,怎样避免同时访问的问题?在C#中没有LOCK的功能?     
 当然有,MFC中有的,C#中基本上都有...   
 我最常用的是互斥量,即Mutex...   
 举个例子..   
 比如一段代码(或者某个共享资源),线程都有可能会调用,那如何来对其互斥访问呢,即某个时间点只允许一个线程对其进行操作?   
 //先实例化Mutex 
 private Mutex mx=new Mutex();     
 .... 
 //在需要互斥访问的地方这样来用.. 
 mx.WaitOne(); 
 //需要互斥访问的代码(或者资源) 
 mx.ReleaseMutex();
------解决方案--------------------TO:TO:我在多个线程中都要对FORM的控件进行操作,怎样避免同时访问的问题?在C#中没有LOCK的功能?   
 对于这个问题,你当然也可以用Lock..   
 for example:   
 public void Function() 
 { 
     System.Object lockThis = new System.Object(); 
     lock(lockThis) 
     { 
         // Access thread-sensitive resources. 
     } 
 }