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

我认为你可以使用标志

bool stop = false;

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

最简洁的答案是不。如果您不控制代码,则无法导致循环终止。

如果你确实控制了代码,你可以建立某种合作,但这听起来很混乱。也许你可以详细说明为什么?

于 2009-08-27T05:00:40.983 回答