首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

跨线程、夸类访问主线程控件,该如何解决

2012-02-11 
跨线程、夸类访问主线程控件程序是Windows程序,我要实现的效果是,当窗体运行的时候,开一个线程,这个线程是

跨线程、夸类访问主线程控件
程序是Windows程序,我要实现的效果是,当窗体运行的时候,开一个线程,
这个线程是定义在另外一个类里面,这个线程每隔1秒种更新主窗体上的label控件的值为当前的时间。
代码如下。请问如何实现。注意Form1窗体和线程ThreadProc是在不同的类中,
请高手帮忙。
namespace testThreadAndDelegate
{
  public partial class Form1 : Form
  {
  public Form1()
  {
  InitializeComponent();
  }

  private void Form1_Load(object sender, EventArgs e)
  {
  new Thread(new ThreadStart(new Thtest().ThreadProc)).Start();  
  }
  }

  class Thtest
  {  
  public void ThreadProc()
  {
  Thread.Sleep(1000);
  //更新Form1上面的Label的值。
  Form1.Label1.Text=System.DateTime.now.tostring();
  ThreadProc();
  }
  }
}

[解决办法]
跨线程调用Winform控件: 
1.在辅助线程调用(可通过delegate)下面的方法InvokeControl();

//写在主线程中(控件)
private void InvokeControl()
{
if (this.InvokeRequired)
this.Invoke(new DelegateChangeText(ChangeText));
else
this.ChangeText();
}

private void ChangeText()
{
this.TextBox.Text = "sd";
}

public delegate void DelegateChangeText(); 

2.在构造函数里使用属性
CheckForIllegalCrossThreadCalls 值设置为 false
即 public Form1()
{
CheckForIllegalCrossThreadCalls = false;


第二种可能不够安全~~ 
Wish you happy....
[解决办法]
你可以在Thtest的构造方法加一个参数,将Form1的实例传进来。然后再Form1中加一个委托,最后在线程中调用该委托。

C# code
namespace testThreadAndDelegate {     public partial class Form1 : Form    {        // 申明委托        public EventHandler<MyEventArgs> ChangeLabel;        public Form1()        {            InitializeComponent();            ChangeLabel = new EventHandler<MyEventArgs>(onChangeLabel); // 委托        }        // 委托方法        private void onChangeLabel(object sender, MyEventArgs e)        {            this.label1.Text = e.Text;        }        private void Form1_Load(object sender, EventArgs e)        {            new Thread(new ThreadStart(new Thtest(this).ThreadProc)).Start();                     }    }    public class Thtest    {        private Form1 form;        public Thtest(Form1 form)        {            this.form = form;        }        public void ThreadProc()         {             Thread.Sleep(1000);             //更新Form1上面的Label的值。               //Form1.Label1.Text=System.DateTime.now.tostring();             // 调用委托            form.Invoke(form.ChangeLabel, new object[] { null, new MyEventArgs(System.DateTime.Now.ToString()) });            ThreadProc();         }     }    // 委托参数    public class MyEventArgs : EventArgs    {        private String text;        public MyEventArgs(String text)        {            this.text = text;        }        public String Text        {            get { return text; }        }    }} 

热点排行