0

動作している次のコードがありますが、非常に汚いです。実際、コードは、私が追加した部分 (一時停止ボタンと停止ボタン) を除いて問題ありません。私はC#が初めてなので、どんな助けも高く評価されます。

    private void pause_button_Click(object sender, EventArgs e)
    {
        start = false; pause = true; stop = false;
        guiUpdate();
        PauseEvent.Reset();
    }

    private void stop_button_Click(object sender, EventArgs e)
    {
        if (pause == true)
        {
            PauseEvent.Set();
            pause = false;
            this.start_button.Click -= new System.EventHandler(this.resume_button_Click);
        }
        start = false; stop = true;
    }

    private int activeThreads = 0;
    private Thread thread;
    private void DoWork(object sender)
    {
        string line = null;
        ereader = new StreamReader(MY_LIST);
        do
        {
            lock (ereader)
            {
                PauseEvent.WaitOne();
                line = ereader.ReadLine();
            }

            //
            //other commands for processing & building the argument
            //

            lock (signal)
            {
                ++activeThreads;
            }

            thread = new Thread(new ParameterizedThreadStart(
                o =>
                {
                    processit((object)o);
                    lock (signal)
                    {
                        --activeThreads;
                        Monitor.Pulse(signal);
                    }
                }));
            thread.Start(argument);

            lock (signal)
            {
                while (activeThreads > maxthreads)
                    Monitor.Wait(signal);
            }

            lock (signal)
            {
                if (!start)
                {
                    showwaiting(true);//shows an animated gif with a "please wait" msg
                    while (activeThreads > 0)
                        Monitor.Wait(signal);
                    showwaiting(false);
                    if (stop == true)
                    {
                        this._BackgroundWorker.CancelAsync();
                        break;
                    }
                }
            }
        }
        while (ereader.Peek() != -1);
        showwaiting(true);
        lock (signal)
        {
            while (activeThreads > 0)
                Monitor.Wait(signal);
        }
        showwaiting(false);
    }


    private void _BackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        start = false; stop = true;
        guiUpdate();
    }

ループの内外でコマンドが重複しないようにするにはどうすればよいですか?

4

1 に答える 1

1

質問のコメントで言及されているのは、コード プラクティスの変更に関する提案です。

  • 条件でブール変数をチェックする場合は、== trueまたはを使用しないでください。== false(ジェフ)
  • 複数のブール変数の代わりに列挙を使用して状態を表します。

また、次のように追加します。

  • 適切な C# 命名規則を使用してください。複数の単語がある場合は、すべての単語を大文字にします。showwaiting(例: を使用する代わりにShowWaiting)。

小さなループの場合、単純なループ以上のものがありますが、それらを最適化する必要はありません。したがって、同じすべてのコードとともに、それらを別のメソッドにリファクタリングできます。

private void ShowAndWait()
{
    showwaiting(true);
    lock (signal)
    {
        while (activeThreads > 0)
            Monitor.Wait(signal);
    }
    showwaiting(false);
}

同じスレッドが以前に取得したモニターをロックしても問題ないことに注意してください。スレッドがすでにロックを所有しているため、これは高速な操作です。その後、両方の場所からこのメソッドを呼び出すことができます。

于 2012-06-09T00:53:29.980 に答える