2012-07-28 89 views
-2

当我单击button应打印A S,但是当我点击按钮2需要停止线程1,需要启动线程2,什么是错在这里请大家帮我如何创建一个线程

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); 
     } 
    } 

回答

1

有很多错误,因为其他海报已经正确指出。我会补充一点:

1)商业级软件中的大多数线程在应用程序的生命周期中从不终止 - 它们被写为无限循环,阻塞调用等待来自其他线程或I/O的某种信号操作。

2)持续创建/终止/销毁线程对象的是昂贵的,难以控制,笨拙调试的,不可靠的,并且通常引起疼痛。

3)如果你的多线程代码包含以下任一:

Suspend() 
Resume(), (except in some thread ctors) 
Join() 
Abort() 
IsAlive() 

你或许应该重新考虑:)

我知道你只是学习,但有时它是更好地修补孔他们得到之前的任何更大的:)

+0

非常感谢 – mssb 2012-07-28 17:55:51

+0

@mssb您应该通过点击答案左上角的绿色勾号来接受答案(如果答案对您有帮助),因此它可以帮助未来的访问者快速找到答案。 – nawfal 2012-07-29 08:13:17

1

你正在创建螺纹在按钮单击事件,使检查threadX.IsAlive将抛出错误报告空引用异常if语句的实例

所以,请在负载创建的线程1 & 2实例

+0

谢谢您的建议 – mssb 2012-07-31 06:42:43

1

检查null ALS O操作。 使用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(); 
    } 
+0

非常感谢你它的工作 – mssb 2012-07-28 17:33:06

+0

Thread.Abort的是危险的。请参阅http://haacked.com/archive/2004/11/12/how-to-stop-a-thread.aspx或进行网络搜索。 – 2012-07-28 17:59:50

相关问题