在C#中停止方法内的循环

时间:2009-08-27 04:47:40

标签: c# loops methods interceptor

有没有办法在另一个方法中停止运行循环或在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应用程序中。

6 个答案:

答案 0 :(得分:7)

如果整个事情都在一个线程中运行,那就没有任何意义了。如果循环正在运行,则没有其他任何东西同时运行。如果你正在另一个线程上运行循环,而另一个线程上的控制方法,你可以完全中止循环线程或检查循环内的一个标志,以决定是否应该在控制方法中中断和设置标志

更新:使该函数返回一个布尔值,指示是否应该在“if”语句中断开并使用它:

if (myFunctionShouldBreakLoop()) break;

答案 1 :(得分: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;
   }
}

这样你可以在某种程度上控制外面的循环......

答案 2 :(得分: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;
}

答案 3 :(得分: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;
            }
        }
}

答案 4 :(得分:1)

我认为你可以使用旗帜

bool stop = false;

for(int i=0;i<num;i++) 
{
 if(stop) break;
}

答案 5 :(得分:1)

简短的回答是:不。如果您不控制代码,则不能导致循环终止。

如果你控制代码,你可以建立某种合作,但听起来很混乱。也许你可以详细说明原因?