0

私は小さなコードサンプルを持っています:

private void MonitorItems()
        {
            if (someCondition)
            {
                dateSelected = DateTime.Now;
                GetAllItems();
            }
            else
            {
                if(allItems.Count>0)
                    CheckAllItems();
            }
            MonitorItems();
        }

メソッド GetAllItems は DB に移動し、コレクションのすべての新しいアイテムを取得します -> allItems。次に、CheckAllItems メソッド:

private void CheckAllItems()
        {
            foreach (Item a in new List<Item>(allItems))
            {
                switch (a.Status)
                {
                    case 1:
                        HandleStatus1();
                        break;
                    case 2:
                        HandleStatus2(a);
                        break;
                    case 0:
                        HandleStatus0(a);
                        break;
                    default:
                        break;
                }
            }  
        }

場合によっては (HandleStatus1 と HandleStatus2 の場合)、DB に移動し、更新を行ってから、メソッド GetAllItems を呼び出してコレクション allItems に再度入力する必要があります。

このタイプのコードは、WinFormsApp で Stack.Overflow 例外をスローしています。2 つの質問が
あります。1. このタイプの例外は、同じコードを使用して WinService アプリケーションでスローされますか?
2. 自己呼び出し方式の代わりにタイマーを使用することについてどう思いますか?

4

4 に答える 4

1

「自己呼び出しメソッド」は、より正確には「再帰メソッド」と呼ばれます。あなたの解決策は創造的です。それをあげましょう。しかし、それをしないでください。スタック スペースは非常に限られています。サービスに移行すると、この問題が発生しますが、これを処理するより良い方法があります。タイマーは、サービスで使用する場合に非常に適しています。

于 2009-10-26T22:08:56.520 に答える
1

あなたのケースでメソッドを再帰的に呼び出すことは、タイマーを使用してそれを行うのと同じくらい悪いことです。どちらもやってはいけない!!

単純なループを使用して、その間にしばらくスレッドをスリープ状態にします。

于 2009-10-26T22:09:07.440 に答える
0

なぜあなたはまったく再発する必要があるのですか?メソッドが再帰を停止してチェーンを終了できるようにするフロー制御ステートメントはありません。無限再帰がおそらくオーバーフローの原因です。より良い解決策は、再帰を完全になくすことです。elseラッパーを削除すると、再帰することなく同じ結果が得られます。

private void MonitorItems()
{
    if(someCondition)
    {
        dateSelected = DateTime.Now;
        GetAllItems();
    }
    if(allItems.Count>0)
        CheckAllItems();
}

これにより、ループに陥ることなく同じ結果が得られます。次に、実行環境のコンテキストで呼び出しを繰り返すルールを実装できます。フォームのボタンクリックまたはサービスアプリケーションのタイマーです。

于 2009-10-26T22:55:10.917 に答える
0

MS IL には .tail オペコードがあります。しかし、c# ドットは末尾再帰を認識したい (。ちなみに、.net では末尾再帰は非常に遅い ((

于 2009-10-26T22:11:21.910 に答える