架构问题
本文关键字:问题 | 更新日期: 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);
}
}
然后,如果循环应该破坏
我更喜欢@userx的解决方案。
然而,另一种选择是,当您想要退出循环时,在调用的操作中抛出异常。在循环外捕获DoEverySecond
和break
中的异常。如果这种情况很常见,请注意这样做对性能的影响。
问题不在c#中,而是在您的代码中
当然,如果操作返回,则不会执行下一行代码。您应该将代码重写为不使用返回语句:
HelperClass.DoEverySecond(5, () =>
{
bool notReturn = true;
// some code to define, return or not
if (notReturn)
// some other code here
});