-2

当我点击button1时应该打印A但是当我点击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);
        }
    }
4

3 回答 3

1

正如其他海报正确指出的那样,有很多错误。我要补充一点:

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

2) 线程对象的持续创建/终止/销毁代价高昂、难以控制、难以调试、不可靠并且通常会导致痛苦。

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

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

你可能应该再想一想:)

我知道你只是在学习,但有时最好在漏洞变得更大之前修补漏洞:)

于 2012-07-28T17:47:54.523 回答
1

您正在按钮单击事件中创建线程的实例,因此检查 threadX.IsAlive 的 if 语句将抛出错误报告空引用异常

所以请在加载时创建线程 1 和 2 的实例

于 2012-07-28T17:16:16.743 回答
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();
    }
于 2012-07-28T17:16:30.673 回答