架构问题

时间:2011-06-15 08:52:29

标签: c# .net architecture

我想做一个替代这个的方法 -

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

问题是当动作包含return时,循环不会停止。 它只是从行动中退出并继续下一次迭代。

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

3 个答案:

答案 0 :(得分:4)

您是否考虑过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 :(得分:1)

我更喜欢@ userx的solution

但是,另一种选择是在要退出循环时在调用的操作中抛出异常。在DoEverySecondbreak中捕获异常。如果这种情况很常见,请注意performance implications这样做。

答案 2 :(得分:0)

问题不在c#中,而在于您的代码中 当然,它们的动作返回,下一行代码不会执行。 您应该将代码重写为不使用return语句:

    HelperClass.DoEverySecond(5, () =>
    {
        bool notReturn = true;
        // some code to define, return or not
        if (notReturn)
        // some other code here
    });