等待n秒,然后下一行代码没有冻结形式

时间:2013-04-14 19:02:39

标签: c# timer delay wait

您好我正在尝试找到一种等待数毫秒的方法,然后再转到下一行代码,

我已经调查了Thread.Sleep,但是这会冻结主窗体,我希望它保持活动状态。

我尝试了定时器和秒表,当他们勾选时应该将它们发布到控制台时冻结主表单。

我找不到在我想要的等待中使用task.delay或后台工作者的方法。

伪代码:

Wait 2 - 6 seconds
Log "waiting"
Log "waiting"
Log "waiting"
Stop Waiting - Run next line of code.

我尝试过的方法只是冻结表单并在之后填充日志,我只想要一个简单的等待方法而不冻结表单而不必处理被调用的事件,这意味着下一行不会运行。

任何帮助都会很棒,因为我还是c#的新手并且它让我有点生气:(

4 个答案:

答案 0 :(得分:27)

await关键字与Task.Delay一起使这个变得微不足道。

public async Task Foo()
{
    await Task.Delay(2000);
    txtConsole.AppendText("Waiting...");
    DoStuff();
}

答案 1 :(得分:3)

尝试使用DispatcherTimer。它是一个非常方便的对象,可以完成委托给UI线程的所有工作。

例如:

private DispatcherTimer _dtTimer = null;

public Constructor1(){
  _dtTimer = new DispatcherTimer();
  _dtTimer.Tick += new System.EventHandler(HandleTick);
  _dtTimer.Interval = new TimeSpan(0, 0, 0, 2); //Timespan of 2 seconds
  _dtTimer.Start();
}

private void HandleTick(object sender, System.EventArgs e) {
  _uiTextBlock.Text = "Timer ticked!";
}

答案 2 :(得分:0)

在这种情况下,Timer应该可以正常工作,除非你将Thread.Sleep放在它的处理程序中,否则处理程序本身需要花费太多时间才能完成。

您尚未指定您使用的UI框架或.Net版本,但对于最新的.Net,您可以使用async / await。这样,当您的代码等待后台任务时,UI不会被冻结

void async MyMethod()
{  
    var result = await Task.Run(() => long_running_code);
}

答案 3 :(得分:-1)

DateTime Tthen = DateTime.Now;
            do
            {
                Application.DoEvents();
            } while (Tthen.AddSeconds(5) > DateTime.Now);