【问题标题】:C# how to set a timer in method? [closed]C#如何在方法中设置计时器? [关闭]
【发布时间】:2015-01-16 11:06:31
【问题描述】:

我想在 C# 方法中添加一个计时器。当此方法执行超过 500 秒时。该方法将抛出异常。像这样:

if(sw.ElapsedMilliseconds > timeout)
{
break;
}

你有什么比秒表更好的主意吗?除了线程。 :)

非常感谢!

【问题讨论】:

  • 你用的有什么问题?
  • 您显示的代码只是跳出循环,而不是如您所说的抛出异常。您希望具体在这里实现什么行为?将经过的时间与超时值进行比较是什么原因不能满足您的特定需求?
  • 有 2 种方法,方法本身正在测量超时并自行终止(正如您已经使用 StopWatch 所做的那样)或方法 可取消(在此在这种情况下,您可以通过使用与执行并行的计数超时来取消它 - TimerThreadTask 等)。如果方法是black box(你不能修改它并且它不支持取消请求),那么你正在谈论terminating。终止正在运行的代码的可能性很小,但不建议这样做。您能否提供更多关于您的情况的详细信息?

标签: c# timer stopwatch


【解决方案1】:

您可以将 Task 与 CancellationTokenSource 一起使用

void LongMethod(CancellationToken token)
{
    for (int i=0; i<51; ++i)
    {
        token.ThrowIfCancellationRequested();
        Thread.Sleep(1000); // some sub operation
    }
}

void Run()
{
    var source = new CancellationTokenSource(50000); // 50 sec delay
    var task = new Task(() => LongMethod(source.Token), source.Token);
    task.Wait();
}

【讨论】:

  • -1 因为使用 Thread.Sleep 通常是个坏主意,尤其是在计时方面。请参阅stackoverflow.com/questions/8815895/… 了解更多信息。更好的解决方案是使用Timer
  • 哦,我的错。我误读了你的回答。忽略我的评论 :) 如果您对您的帖子进行微不足道的编辑,我将能够撤销我的反对票。
  • 我的 -1 变成了 +1。
  • 谢谢大家。我使用了 Thread.Sleep()。特别感谢 Xcelled194。我用它来进行单元测试,可以接受。
猜你喜欢
  • 2014-12-07
  • 2012-07-14
  • 1970-01-01
  • 1970-01-01
  • 2023-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
相关资源
最近更新 更多