日期:2014-05-18  浏览次数:20671 次

关于网上线程访问控件教程的疑问
public partial class Form1 : Form
  {
  Thread mythread1;
  public Form1()
  {
  InitializeComponent();
  mythread1= new Thread(new ThreadStart(mymethod));
  mythread1.IsBackground = true;  
  mythread1.Start();
  mythread1.Suspend();
  }

  private void button1_Click(object sender, EventArgs e)
  {
  // if (mythread1.IsBackground == true&&mythread1.ThreadState == ThreadState.Suspended)
  if (mythread1.ThreadState == (ThreadState.Background | ThreadState.Suspended))
  mythread1.Resume();

  }
  private void mymethod()
  {
  while (true)
  {
  label1.Text = DateTime.Now.ToString();
  Thread.Sleep(1000);
  }
  }
  }


问题一:  看很多教程都说子线程函数不能直接使用主窗口的控件,可我按他们的思路大致写了一个,运行很正常也没报错,我.net应该是2.0标准以上的。   我觉得除非线程函数没写在主Form里,调用控件时才会出问题,昨天得mngzilin教诲,学习了用事件来解决的办法。 但如果线程函数就是写在主Form类里,我用了没出什么问题,网上很多教程为什么都说会报错呢。




问题二: 网上说针对控件不能访问的情况

给出得解决办法

public delegate void MyInvoke(string str);

private void button9_Click(object sender, EventArgs e)
  {
  //_myInvoke = new MyInvoke(SetText);
  //CheckForIllegalCrossThreadCalls = false;
  Thread t = new Thread(new ThreadStart(fun));
  t.Start();
  }

  private void fun()
  {
  //_myInvoke("dddd");
  SetText("ddd");
  }
  private void SetText(string s)
  {
  if (textBox6.InvokeRequired)
  {
  MyInvoke _myInvoke = new MyInvoke(SetText);
  this.Invoke(_myInvoke, new object[] { s });
  }
  else
  {
  this.textBox6.Text = s;
  }
  }


很多教程也这么写,可我怎么就看不明白SetText里if else 这是瞎折腾什么呢这是,还MyInvoke _myInvoke = new MyInvoke(SetText); 委托自己

------解决方案--------------------
不报错,你把构造函数中的mythread1.Suspend();去掉试试

InvokeRequired表示调用方位于创建控件所在的线程以外的线程中。