17

嗨,我正在尝试找到一种在移动到下一行代码之前等待几毫秒的方法,

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

我尝试了计时器和秒表,当它们应该在它们打勾时发布到控制台时,它们都会冻结主窗体。

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

伪代码:

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

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

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

4

4 回答 4

28

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

public async Task Foo()
{
    await Task.Delay(2000);
    txtConsole.AppendText("Waiting...");
    DoStuff();
}
于 2013-04-14T19:10:31.027 回答
2

尝试使用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!";
}
于 2013-04-14T19:06:49.807 回答
-1

在这种情况下,计时器应该可以正常工作,除非您将 Thread.Sleep 放在其处理程序中,或者处理程序本身需要太多时间才能完成。

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

void async MyMethod()
{  
    var result = await Task.Run(() => long_running_code);
}
于 2013-04-14T19:07:45.847 回答
-1
DateTime Tthen = DateTime.Now;
            do
            {
                Application.DoEvents();
            } while (Tthen.AddSeconds(5) > DateTime.Now);    
于 2018-03-12T13:20:26.103 回答