【问题标题】:Setting Timeouts?设置超时?
【发布时间】:2010-07-08 15:25:09
【问题描述】:

我有一个进程可能会陷入无限循环,我想添加 5 秒超时,这样它就不会永远挂起。

bool FlagSuccess = false;
while (FlagSuccess == false)
{
    try
    {
    //Blah blah blah
    FlagSuccess=true;
    }
    catch
    {
    }
}

【问题讨论】:

  • 修复循环可能会更好?
  • 修复循环?我很乐意,请进一步解释。

标签: c# timeout


【解决方案1】:

这是我尽量避免的结构。但如果你必须:

bool FlagSuccess = false;
DateTime timeout = DateTime.UtcNow.AddSeconds(5);
while (FlagSuccess == false && DateTime.UtcNow < timeout)
{
    try
    {
    //Blah blah blah
    FlagSuccess=true;
    }
    catch
    {
    }
}

【讨论】:

  • 您需要将其更改为添加 5 秒,而不是 5 分钟
  • 我愿意尝试不同的事情。你会推荐我使用什么类型的构造?我对 C# 很陌生,我的很多代码只是我在黑暗中摸索。我很高兴在我还是新手的时候学习更多“标准友好”的代码实践。
  • 我会将其更改为 DateTime.UtcNow 否则您将面临根本不通过循环(非常糟糕)或旋转超过一个小时(有点糟糕)的风险。跨度>
  • @Brian,你能解释一下这个循环运行错误是怎么发生的吗?如果您使用的是 DateTime.Now,我只能想象它会遇到您描述的错误,如果在运行时更改时区...
  • @Soo:是的,这是正确的。因此,如果我们有一个 5 秒的问题窗口,该窗口在一年中出现两次,并且如果您假设代码每分钟启动一次,那么您将有 1 - (1 - 5/60)^2 = 0.16 = 16% 的概率遇到一年的问题。如果代码每小时运行一次,几率会显着下降到只有 0.3%。通常我会说权衡解决方案的风险与难度,除非在这种情况下解决问题非常容易,您不妨使用UtcNow 并就此打住。
猜你喜欢
  • 2015-07-04
  • 2023-03-03
  • 2011-02-17
  • 2012-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多