当我点击button1应该打印A s但是当我点击button2需要停止thread1并需要启动thread2时,这里有什么问题请帮帮我
private void button1_Click(object sender, EventArgs e)
{
if (thread2.IsAlive)
{
thread2.Suspend();
}
thread1 = new Thread(threadOne);
thread1.Start();
}
private void button2_Click(object sender, EventArgs e)
{
if (thread1.IsAlive)
{
thread1.Suspend();
}
thread2 = new Thread(threadTwo);
thread2.Start();
}
private void threadOne() {
for (int i=0; i < 20; i++ )
{
Console.Write("A");
Thread.Sleep(500);
}
}
private void threadTwo()
{
for (int i = 0; i < 20; i++)
{
Console.Write("B");
Thread.Sleep(500);
}
}
答案 0 :(得分:1)
您正在Button Click事件中创建Thread的实例,因此检查threadX.IsAlive的if语句将抛出错误报告null引用异常
所以请创建thread1&amp;的实例。 2正在加载
答案 1 :(得分:1)
同时检查null
。
无论如何都要使用Abort()
方法而不是Suspend(),每次创建一个新线程。
private void button1_Click(object sender, EventArgs e)
{
if (thread2!=null && thread2.IsAlive)
{
thread2.Abort();
}
thread1 = new Thread(threadOne);
thread1.Start();
}
private void button2_Click(object sender, EventArgs e)
{
if (thread1!=null && thread1.IsAlive)
{
thread1.Abort();
}
thread2 = new Thread(threadTwo);
thread2.Start();
}
答案 2 :(得分:1)
正如其他海报正确指出的那样,有很多错误。我想补充一点:
1)商业级软件中的大多数线程在应用程序的生命周期内永远不会终止 - 它们被编写为具有阻塞调用的无限循环,等待来自其他线程或I / O操作的某种信号。
2)持续创建/终止/销毁线程对象是昂贵的,难以控制,难以调试,不可靠并且通常会导致痛苦。
3)如果您的多线程代码包含以下任何内容:
Suspend()
Resume(), (except in some thread ctors)
Join()
Abort()
IsAlive()
你应该再考虑一下:)
我知道你只是在学习,但有时最好在他们变得更大之前修补漏洞:)