关于网上线程访问控件教程的疑问
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表示调用方位于创建控件所在的线程以外的线程中。