等待n秒,然后下一行代码没有冻结forms
嗨我想找到一个等待几毫秒的方法,然后再转到下一行代码,
我已经研究过Thread.Sleep,但这会冻结主窗体,我希望它保持活跃状态。
我尝试了定时器和秒表,当他们勾选时应该发布到控制台时冻结主表单。
我找不到在我想要的等待中使用task.delay或后台工作者的方法。
伪代码:
Wait 2 - 6 seconds Log "waiting" Log "waiting" Log "waiting" Stop Waiting - Run next line of code.
我尝试过的方法只是冻结表单并在之后填充日志,我只想要一个简单的等待方法而不冻结表单而不必处理被调用的事件,这意味着下一行不会运行。
任何帮助都会很棒,因为我还是c#的新手并且它让我有点生气:(
await
关键字与Task.Delay
结合使用变得微不足道。
public async Task Foo() { await Task.Delay(2000); txtConsole.AppendText("Waiting..."); DoStuff(); }
尝试使用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!"; }
在这种情况下,Timer应该可以正常工作,除非你将Thread.Sleep放在其处理程序中,否则处理程序本身需要花费太多时间才能完成。
您尚未指定使用的UI框架或.Net版本,但对于最新的.Net,您可以使用async / await。 这样,当您的代码等待后台任务时,UI不会被冻结
void async MyMethod() { var result = await Task.Run(() => long_running_code); }
DateTime Tthen = DateTime.Now; do { Application.DoEvents(); } while (Tthen.AddSeconds(5) > DateTime.Now);