Проблема архитектуры - PullRequest
       6

Проблема архитектуры

4 голосов
/ 15 июня 2011

Я хочу сделать метод, который заменит это-

 for (var i = 0; i < seconds; i++)
        {
            ...... // code that should run every second 

            Thread.Sleep(1000);
        }

Итак, я написал следующий метод:

  public static void DoEverySecond(int seconds, Action action)
    {
        for (var i = 0; i < seconds; i++)
        {
            action.Invoke();
            Thread.Sleep(1000);
        }
    }

и теперь каждый раз, когда я хочу что-то делать каждую секунду, я могу просто позвонить -

 HelperClass.DoEverySecond(5, () =>
        {
            Console.Write("Hellow")
        });

проблема в том, что когда действие содержит возврат, цикл не останавливается. Он просто выходит из действия и переходит к следующей итерации.

  HelperClass.DoEverySecond(5, () =>
        {
              return;
        });

Ответы [ 3 ]

4 голосов
/ 15 июня 2011

Рассматривали ли вы Func вместо Action, а затем измените свой код на что-то вроде:

  public static void DoEverySecond(int seconds, Func<bool> action)
    {
        for (var i = 0; i < seconds; i++)
        {
            if(!action.Invoke())
            {
                return;
            }
            Thread.Sleep(1000);
        }
    }

И затем ваша функция возвращает false, если ваш цикл должен прерваться

1 голос
/ 15 июня 2011

Я предпочитаю @ userx's решение .

Тем не менее, другой вариант - бросить исключение внутри вызванного действия, когда вы хотите выйти из цикла.Поймать исключение в DoEverySecond и break вне цикла.Помните о последствиях для производительности при выполнении этого, если это обычное явление.

0 голосов
/ 15 июня 2011

Проблема не в c #, а в вашем коде.
Конечно, их действие возвращает, следующие строки кода не будут выполняться.Вы должны переписать свой код, чтобы не использовать оператор возврата:

    HelperClass.DoEverySecond(5, () =>
    {
        bool notReturn = true;
        // some code to define, return or not
        if (notReturn)
        // some other code here
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...