【问题标题】:Implement c# timeout实现 c# 超时
【发布时间】:2011-06-28 11:35:05
【问题描述】:

使用这样的while循环是不好的做法吗? 也许使用 Stopwatch 更好,或者这个解决方案有一些缺陷?

    public void DoWork()
    {
        //do some preparation
        DateTime startTime = DateTime.Now;
        int rowsCount = 0;
        int finalCount = getFinalCount();
        do
        {
            Thread.Sleep(1000);
            rowsCount = getRowsCount(); // gets rows count from database, rows are added by external app.
        } while (rowsCount < finalCount && DateTime.Now - startTime < TimeSpan.FromMinutes(10));

    }

看到这篇文章Implement C# Generic Timeout, 但是在简单的场景中使用它太复杂了——你需要考虑线程的同步,是否应该中止它们等等。

【问题讨论】:

  • 你想对创建 TimeOut 做什么?如果你告诉你的整个场景,也许我们可以提供不同的使用方式。
  • 只需要在一段时间后停止工作 - 开始工作,如果运行超过 10 分钟停止工作。调用该方法的线程可以被阻塞。
  • @anderhil:那是什么工作?你控制那个代码吗?你是否意识到通过睡觉,你没有工作?你可能想提供一个更好的例子。
  • @Martinho Fernandes:更新了问题。 getRowsCount 从数据库表中获取行。表由外部应用程序更新,我需要等待通过 getFinalCount 方法获得的数据库中特定数量的行。但是可能会出现什么都没有更新的情况,为了防止无限循环,我想等待一段时间然后停止工作。

标签: c# .net timeout


【解决方案1】:

据我了解,您希望您的方法完成一些工作,直到完成或经过一段时间?我会为此使用Stopwatch,并在循环中检查经过的时间:

void DoWork()
{
    // we'll stop after 10 minutes
    TimeSpan maxDuration = TimeSpan.FromMinutes(10);
    Stopwatch sw = Stopwatch.StartNew();
    DoneWithWork = false;

    while (sw.Elapsed < maxDuration && !DoneWithWork)
    {
        // do some work
        // if all the work is completed, set DoneWithWork to True
    }

    // Either we finished the work or we ran out of time.
}

【讨论】:

  • 感谢您的回答。一开始我想的是 Stopwatch,后来我觉得 DateTime 更简单,你能解释一下为什么 Stopwatch 更好吗?我以为是基于 DateTime 的实现...
  • @anderhil:我认为秒表更具可读性:)。与 DateTime.Now 相比,唯一的另一个优势是秒表 可以 具有更高的分辨率(不过,这对你来说并不重要)。
  • 我不会使用DateTime,因为在夏令时之后日期可能会在我下方更改。它可能会导致代码等待太久(一小时十分钟),或者可能导致代码等待的时间不够长。但是Stopwatch 知道已经过去了多少分钟,无论现在是几点。
  • 这是一个不错的干净解决方案 - 谢谢。我喜欢使用秒表,因为sw.Elapsed &lt; maxDuration 比涉及DateTime.Now() 的公式更容易阅读。
【解决方案2】:

最好使用 System.Timers.Timer 类。

【讨论】:

  • 这不是 Timer 的用途。
  • 是的,但是我正在搜索的内容... :D "Timeout" 可能会产生误导,因为 Javascript 的 setTimeout() 方法实际上做了 System.Timers.Timer 在 C# 中所做的事情。
猜你喜欢
  • 2023-03-27
  • 2012-04-26
  • 2011-08-09
  • 1970-01-01
  • 2015-05-07
  • 2013-05-06
  • 2017-03-25
  • 1970-01-01
相关资源
最近更新 更多