Pare um circuito dentro de um método em C #

votos
1

Existe alguma maneira de parar um loop funcionando dentro de outro método ou inserir uma instrução break dinamicamente em C #?

obrigado

Edit: eu quero ser capaz de interceptar de forma dinâmica o método e inserir uma pausa para parar o loop quando um evento é acionado em outros function.I ter várias instâncias da classe e eu quero parar o loop em cada caso, sempre que necessário e gerenciar todas as instâncias. Considere várias instâncias de estar em uma lista genérica

exemplo:

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

Eu preciso disso porque eu quero quebrar o ciclo uma vez o usuário armazena alguns enorme quantidade de dados.Quando o usuário importa os dados, eu recebo um evento disparado. Mas eu não posso manter a verificação de banco de dados a partir de várias instâncias, uma vez que estraga SQLServer.

Isto está em uma aplicação ASP.Net.

Publicado 27/08/2009 em 05:47
fonte usuário
Em outras línguas...                            


6 respostas

votos
7

Se a coisa toda está sendo executado em um único segmento, não faria qualquer sentido. Se o circuito está funcionando, então nada mais está funcionando ao mesmo tempo. Se você estiver executando um loop em outro segmento e o método de controle em outro segmento, você pode abortar o fio circuito completamente ou verificar uma bandeira dentro do loop para decidir se você deve ou não quebrar e definir o sinalizador de forma adequada no método de controle .

Update: fazer essa função retornar um valor booleano que indica se você deve quebrar e usá-lo em "uma if" declaração:

if (myFunctionShouldBreakLoop()) break;
Respondeu 27/08/2009 em 05:51
fonte usuário

votos
3

Outra opção seria a de levantar CancelEventArgs durante cada iteração do loop. Provavelmente não é o mais eficiente, mas uma outra opção, no entanto:

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

E, em seguida, em outro lugar:

myObj.LoopIncrement += MyHandler;

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

Desta forma, você pode tanto controlar o ciclo de fora ....

Respondeu 27/08/2009 em 05:56
fonte usuário

votos
2

Que tal usar iteradores, e magia de rendimento para resolver o problema.

Aqui está um artigo sobre listas infinitas que possa ser útil

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;
            }
        }
}
Respondeu 27/08/2009 em 12:33
fonte usuário

votos
2

Têm a condição em uma propriedade bloqueada.

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;
}
Respondeu 27/08/2009 em 05:49
fonte usuário

votos
1

A resposta curta é não. Se você não controlar o código, então você não pode fazer com que o loop para terminar.

Se você fizer controlar o código, você poderia construir em algum tipo de cooperação, mas parece confuso. Talvez você possa elaborar sobre por quê?

Respondeu 27/08/2009 em 06:00
fonte usuário

votos
1

Eu acho que você pode usar o sinalizador

bool stop = false;

for(int i=0;i<num;i++) 
{
 if(stop) break;
}
Respondeu 27/08/2009 em 05:50
fonte usuário

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