【问题标题】:Insert delay/wait in code c#在代码c#中插入延迟/等待
【发布时间】:2015-11-01 16:40:16
【问题描述】:
    public void OpenUpForm(object sender, EventArgs e)
    {
        if (forms.Count == numberoftimes)
        {
            forms.ForEach(f =>
            {
                f.Close(); 
                f.Dispose(); 
            });
            forms.Clear(); 
            //Need Delay Here
            return;
        }
        forms.Add(new Form1());
        forms.Last().Show();
    }

你好,我有这段代码,我需要在forms.Clear(); 之后添加延迟,但我是编码新手,我无法弄清楚。 我尝试过使用Task.DelayThread.Sleep,但它锁定了我的用户界面。是否可以添加延迟锁定应用程序?谢谢。

【问题讨论】:

  • 我不明白您需要延迟。这似乎是可怕的代码。如果您在比您的计算机慢的计算机上运行它,它会崩溃吗?蓝屏幕?如果它更快呢?
  • 我正在添加一个 numericupdown 并希望延迟所选时间的代码。在较慢的计算机上运行正常,但我愿意接受建议。

标签: c# .net multithreading winforms


【解决方案1】:

您可以将方法标记为异步并使用它:

await Task.Delay(2000);

不会阻塞ui线程

public async void OpenUpForm(object sender, EventArgs e)
{
    if (forms.Count == numberoftimes)
    {
        forms.ForEach(f =>
        {
            f.Close(); 
            f.Dispose(); 
        });
        forms.Clear(); 
        await Task.Delay(2000);
        return;
    }
    forms.Add(new Form1());
    forms.Last().Show();
}

这将是这样的。

  • 创建一个在 2 秒后运行完成的新任务
  • Ui 线程重新启动以继续执行/处理其他事件
  • 2 秒过后,UI 线程返回并从 await 之后继续执行异步方法

【讨论】:

  • 当我调试它时,我可以看到延迟计时器已设置,但是当我运行它时,它就像没有延迟一样运行(我的延迟是 7000)。
  • 这是因为Task.Delay(7000) 操作永远不会使调用线程过时。它启动一个新线程运行,然后返回到您调用它的位置。然后它继续执行。 await 关键字确保 Task.Delay 之后的代码在 7 秒结束之前不会执行。
猜你喜欢
  • 2022-10-16
  • 2021-01-10
  • 1970-01-01
  • 2012-02-12
  • 1970-01-01
  • 1970-01-01
  • 2018-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多