【问题标题】:Delay in c# not thread.sleep [closed]c#中的延迟不是thread.sleep [关闭]
【发布时间】:2013-03-24 11:10:47
【问题描述】:

大家有没有像 VB 一样的 c# 选项?

Sub Delay(ByVal dblSecs As Double)

Const OneSec As Double = 1.0# / (1440.0# * 60.0#)
Dim dblWaitTil As Date
Now.AddSeconds(OneSec)
dblWaitTil = Now.AddSeconds(OneSec).AddSeconds(dblSecs)
Do Until Now > dblWaitTil
Application.DoEvents() ' Allow windows messages to be processed
Loop

End Sub

【问题讨论】:

  • 这是一个忙碌的等待 - 在众多延迟的方法中绝对是最糟糕的。
  • 看起来你在做:DateTime dblWaitTil = DateTime.Now.AddSeconds(dblSecs); while (DateTime.Now < dblWaitTil) { }。这将是一个非常“忙碌”(消耗资源)的循环。
  • 为什么你要延迟?我问是因为您的回答可能会提示一个比简单延迟更好的解决方案。

标签: c# .net


【解决方案1】:

是的,您可以在 C# 中做同样的事情,但这是一个非常糟糕的主意。

这种暂停的方式称为忙循环,因为它会让主线程使用尽可能多的 CPU。

你想要做的是设置一个计时器,并从滴答事件中调用一个回调方法:

public void Wait(double seconds, Action action) {
  Timer timer = new Timer();
  timer.Interval = (int)(seconds * 1000.0);
  timer.Tick += (s, o) => {
    timer.Enabled = false;
    timer.Dispose();
    action();
  };
  timer.Enabled = true;
}

使用示例:

textbox.text = "Test";
Wait(5.0, () => {
  textbox.text = "Finish";
});

【讨论】:

  • 我想链接这个 textbox.text = "Test";延迟(5 秒)然后 textbox.text = "Finish";有没有其他好的方法可以做到这一点?
  • 这是异步的,它不会真正等待。如果您的程序在间隔之前完成,则永远不会调用回调代码。我不确定 OP 是否想要这种行为。
  • @SergeyS:是的,它是异步的,这就是您在事件驱动的环境中执行此类操作的方式。你建议什么?繁忙的循环?
  • 我为他提议 Thread.Sleep(),但如果他对忙循环没问题,为什么不呢?)
  • @SergeyS:我确实了解代码,但显然您不了解。
【解决方案2】:

您想要Timer 类或DispatcherTimer 类,以适合您的需要。

【讨论】:

  • 你能举个例子吗,我是 C# 新手.. :(
  • 参考链接,里面有小例子。
【解决方案3】:

Patterson 算法将适用于我认为的调度程序。

http://en.wikipedia.org/wiki/Sardinas%E2%80%93Patterson_algorithm

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    • 1970-01-01
    相关资源
    最近更新 更多