日期:2014-05-20  浏览次数:20732 次

多线程操作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.
}
}