-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

Button Clickイベントでスレッドのインスタンスを作成しているため、threadX.IsAliveをチェックするifステートメントは、null参照例外を報告するエラーをスローします。

したがって、ロード時にthread1と2のインスタンスを作成してください

于 2012-07-28T17:16:16.743 に答える
1

また確認してくださいnullAbort()とにかく毎回新しいスレッドを作成するので、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 に答える
1

他のポスターが正しく指摘しているように、かなり間違っています。私はこれを追加します:

1)商用グレードのソフトウェアのほとんどのスレッドは、アプリケーションの存続期間中に終了することはありません。他のスレッドまたはI/O操作からのある種のシグナリングを待機するブロッキング呼び出しを伴う無限ループとして記述されます。

2)スレッドオブジェクトの継続的な作成/終了/破棄は、費用がかかり、制御が難しく、デバッグが困難で、信頼性が低く、一般的に苦痛を引き起こします。

3)マルチスレッドコードに次のいずれかが含まれている場合:

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

あなたはおそらくもう一度考えるべきです:)

あなたが学んでいるだけだと知っていますが、穴が大きくなる前に穴を修正したほうがよい場合もあります:)

于 2012-07-28T17:47:54.523 に答える