架构问题

本文关键字:问题 | 更新日期: 2023-09-27 17:59:23

我想做一个方法来取代这个-

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

架构问题

您是否考虑过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

我更喜欢@userx的解决方案。

然而,另一种选择是,当您想要退出循环时,在调用的操作中抛出异常。在循环外捕获DoEverySecondbreak中的异常。如果这种情况很常见,请注意这样做对性能的影响。

问题不在c#中,而是在您的代码中
当然,如果操作返回,则不会执行下一行代码。您应该将代码重写为不使用返回语句:

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