读书人

关于网上线程访问控件教程的疑问,该如

发布时间: 2012-04-26 14:01:31 作者: rapoo

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

读书人网 >C#

热点推荐