如何创建一个线程

时间:2012-07-28 17:10:05

标签: c# multithreading

当我点击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);
        }
    }

3 个答案:

答案 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()

你应该再考虑一下:)

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