我想做一个替代这个的方法 -
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;
});
答案 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。
但是,另一种选择是在要退出循环时在调用的操作中抛出异常。在DoEverySecond
和break
中捕获异常。如果这种情况很常见,请注意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
});