2

別のメソッド内で実行中のループを停止したり、C# で動的に break ステートメントを挿入したりする方法はありますか?

ありがとう

編集:別の関数でイベントがトリガーされたときに、メソッドを動的にインターセプトし、ブレークを挿入してループを停止できるようにしたい.クラスのインスタンスがいくつかあり、必要に応じて各インスタンスでループを停止して管理したいすべてのインスタンス。複数のインスタンスがジェネリック リストにあると見なす

例 :

List<myclass> objlist=new List<myclass>();

foreach(myclass obj in objlist)
{
obj.loopingfunction().BreakLoop //or something like this (assuming that the loopingfunction is already called)
}

ユーザーが大量のデータを保存したら、ループを中断したいので、これが必要です。ユーザーがデータをインポートすると、イベントが発生します。しかし、sqlserver が台無しになるため、複数のインスタンスからデータベースをチェックし続けることはできません。

これは ASP.Net アプリケーションにあります。

4

6 に答える 6

7

すべてが単一のスレッドで実行されている場合、意味がありません。ループが実行されている場合、同時に実行されているものは他にありません。別のスレッドでループを実行し、別のスレッドで制御メソッドを実行している場合は、ループ スレッドを完全に中止するか、ループ内のフラグをチェックして、ブレークして制御メソッドでフラグを適切に設定する必要があるかどうかを判断できます。 .

if更新: その関数が " " ステートメントで中断して使用する必要があるかどうかを示すブール値を返すようにします。

if (myFunctionShouldBreakLoop()) break;
于 2009-08-27T04:51:24.963 に答える
3

別のオプションは、ループのすべての反復中にCancelEventArgsを発生させることです。おそらく最も効率的ではありませんが、それでも別のオプションです。

    private void SomeMethod()
    {
        for (int i = 0; i <= 100000; i++)
        {
            Console.WriteLine(i);
            if (LoopIncrement != null)
            {
                CancelEventArgs args = new CancelEventArgs();
                LoopIncrement(null, args);
                if (args.Cancel)
                {
                    break;
                }
            }
        }

そして他の場所:

myObj.LoopIncrement += MyHandler;

private void MyHandler(object sender, CancelEventArgs e)
{
   if(someCondition)
   {
      e.Cancel = true;
   }
}

このようにして、外部からループをいくらか制御できます。

于 2009-08-27T04:56:09.090 に答える
2

施錠されたプロパティに条件を設定します。

private Boolean BreakCondition
{
    get { lock(_LockObject) { return _BreakCondition; }  }
    set { lock(_LockObject) { _BreakCondition = value; }  }
}
private Boolean _BreakCondition = false;
private Object _LockObject = new Object();


if (this.BreakCondition)
{
    break;
}
于 2009-08-27T04:49:06.560 に答える
2

イテレータを使用して、問題を解決するためにマジックを生成するのはどうですか。

これは役に立つかもしれない無限リストに関する記事です

http://www.codethinked.com/post/2009/02/04/Infinite-Lists-With-C-Yield.aspx

 class Program
    {
        static void Main(string[] args)
        {
            Predicate<int> when = i => i > 100 && Console.ReadKey().KeyChar.ToString() == "0";

            foreach(var i in Numbers().BreakOn(when))
            {
                Console.WriteLine(i);
            }

            Console.ReadLine();
        }

        private static IEnumerable<int> Numbers()
        {
            var i = 0;
            while(true)
            {
                yield return i++;
            }
        }


    }

    public static class Util
    {
        public static IEnumerable<int> BreakOn(this IEnumerable<int> sequence, Predicate<int> when)
        {
            foreach(int i in sequence)
            {
                if(when(i))
                {
                    yield break;
                }
                yield return i;
            }
        }
}
于 2009-08-27T11:33:38.677 に答える
1

簡単な答えは:いいえ。コードを制御しない場合、ループを終了させることはできません。

コードを制御する場合は、何らかの協力関係を構築できますが、面倒に聞こえます。多分あなたは理由を詳しく説明することができますか?

于 2009-08-27T05:00:40.983 に答える
1

フラグ使えると思う

bool stop = false;

for(int i=0;i<num;i++) 
{
 if(stop) break;
}
于 2009-08-27T04:50:52.330 に答える