Zastavení smyčku uvnitř metody v C #

hlasů
1

Existuje nějaký způsob, jak zastavit běžící smyčku uvnitř jinou metodou nebo vložení příkazu break dynamicky v C #?

dík

Edit: Chci, aby bylo možné dynamicky zachytit metody a vložit konec zastavit smyčku když se událost spuštěna v jiném function.I mít několik instancí třídy a chci zastavit smyčku v každém případě bude v případě potřeby a spravovat všechny instance. Vezměme si více instancí být v druhovém seznamu

Příklad:

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)
}

Potřebuju to, protože chci, aby přerušení smyčky Jakmile uživatel obchodů některé velké množství data.When uživatel importuje data, mám událost vystřelil. Ale nemohu udržet kontrolu databáze z více instancí, protože šrouby do SQLSERVER.

To je v aplikaci ASP.NET.

Položena 27/08/2009 v 05:47
zdroj uživatelem
V jiných jazycích...                            


6 odpovědí

hlasů
7

V případě, že celá věc běží v jednom vlákně, to by nedávalo žádný smysl. Pokud je spuštěna smyčka, pak nic jiného běží ve stejnou dobu. Pokud používáte smyčku na jiném vlákně a kontrolní metody na jiném vlákně, můžete buď zrušit závit smyčky zcela nebo zkontrolovat příznak uvnitř smyčky se rozhodnout, zda byste měli přerušit a nastavit příznak vhodně v kontrolní metody ,

Aktualizace: dělat, že funkce vrací logickou hodnotu indikující, zda byste měli přerušit a použít ji v „ if“ prohlášení:

if (myFunctionShouldBreakLoop()) break;
Odpovězeno 27/08/2009 v 05:51
zdroj uživatelem

hlasů
3

Další možností by bylo zvýšit CancelEventArgs při každém opakování smyčky. Pravděpodobně ne nejúčinnější, ale jiná možnost nicméně:

    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;
                }
            }
        }

A pak na jiném místě:

myObj.LoopIncrement += MyHandler;

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

Tímto způsobem můžete ovládat poněkud smyčku zvenčí ....

Odpovězeno 27/08/2009 v 05:56
zdroj uživatelem

hlasů
2

Jak se o používání iterátorů a výnosové magie k vyřešení problému.

Zde je článek o nekonečných seznamech, které by mohly být užitečné

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;
            }
        }
}
Odpovězeno 27/08/2009 v 12:33
zdroj uživatelem

hlasů
2

Mají podmínku uvedenou v uzamčeném objektu.

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;
}
Odpovězeno 27/08/2009 v 05:49
zdroj uživatelem

hlasů
1

Stručná odpověď zní: ne. Pokud nechcete ovládat kód, pak se nemůže způsobit smyčky ukončit.

Pokud tak učiníte ovládat kód, můžete postavit v jakémsi spolupráce, ale zní to chaotický. Možná si můžete rozvést, proč?

Odpovězeno 27/08/2009 v 06:00
zdroj uživatelem

hlasů
1

Myslím, že můžete použít příznak

bool stop = false;

for(int i=0;i<num;i++) 
{
 if(stop) break;
}
Odpovězeno 27/08/2009 v 05:50
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more