这是一个生成50个质数的小程序,用一个线程实现它.
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private Thread primeThead;
private void btnStart_Click(object sender, EventArgs e)
{
primeThead = new Thread(new ThreadStart(Generate));
primeThead.Name = "质数";
primeThead.Start();
}
private void Generate()//这个方法用来生成50个质数
{
bool isPrime = true;
int count = 2;
lstPrime.Items.Add(2);//提示这里出错了
for (int i = 3; count < 50; i++)
{
isPrime = true;
for (int j = 2; j <= (i / 2);j++ )
{
if (i % j == 0)
{
isPrime = false;
break;
}
}
if (isPrime)
{
lstPrime.Items.Add(i);
count++;
Thread.Sleep(100);
}
} }
}出现错误提示->线程间操作无效: 从不是创建控件“lstPrime”的线程访问它
请问怎么改上面的这段代码啊? 不调试直接运行,结果正常;用调试按调就出错
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private Thread primeThead;
private void btnStart_Click(object sender, EventArgs e)
{
primeThead = new Thread(new ThreadStart(Generate));
primeThead.Name = "质数";
primeThead.Start();
}
private void Generate()//这个方法用来生成50个质数
{
bool isPrime = true;
int count = 2;
lstPrime.Items.Add(2);//提示这里出错了
for (int i = 3; count < 50; i++)
{
isPrime = true;
for (int j = 2; j <= (i / 2);j++ )
{
if (i % j == 0)
{
isPrime = false;
break;
}
}
if (isPrime)
{
lstPrime.Items.Add(i);
count++;
Thread.Sleep(100);
}
} }
}出现错误提示->线程间操作无效: 从不是创建控件“lstPrime”的线程访问它
请问怎么改上面的这段代码啊? 不调试直接运行,结果正常;用调试按调就出错
{
if(this.InvokeRequired)
{
this.Invoke(new MethodInvoker(Generate),null);
}
else
{
bool isPrime = true;
int count = 2;
lstPrime.Items.Add(2);//提示这里出错了
for (int i = 3; count < 50; i++)
{
isPrime = true;
for (int j = 2; j <= (i / 2);j++ )
{
if (i % j == 0)
{
isPrime = false;
break;
}
}
if (isPrime)
{
lstPrime.Items.Add(i);
count++;
Thread.Sleep(100);
}
}
}
}
1、新开线程修改主线程控件属性为什么要报错?
答:vs2003时,这种情况是不报错的,vs2005时,微软不建议这样处理。
方法一:VS2003兼容方法处理,如下:
public Form1()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
}
方法二:微软建议作法,使用委托来修改主线程控件的属性。
2、线程中调试为什么要出错?
答:新开线程的处理部份,如你的Generate(),与主线程在同一个类中,调试会出错,如果将Generate()放在另一个类中,你调试就不会出错了,VS2005就有这个问题,不知道微软是怎么考虑的。立即成为编程经验丰富的程序员不是梦,详见:http://www.psec.net.cn