C# 网络。框架 2.0 |耽误时间?

C# NET. Framework 2.0 | Make a delay?

提问人:user16567291 提问时间:5/26/2022 更新时间:5/27/2022 访问量:411

问:

如何让我的程序等待 1 秒然后做某事? 就像在NET中一样。带有 Task.Delay() 的框架 4.8,但我使用的是 NET。Framework 2.0 用于我的旧 Windows 2000 笔记本电脑的项目。我能做些什么吗?

    panel1.Visible = true;
    //delay
    panel2.Visible = true;
    //delay
    ...
C# 延迟 net-2.0

评论

1赞 Martin Costello 5/26/2022
Thread.Sleep()?learn.microsoft.com/en-us/dotnet/api/......
0赞 Charlieface 5/26/2022
或者一个 ?System.Windows.Forms.Timer
2赞 Lasse V. Karlsen 5/26/2022
Thread.Sleep 不是一个好的选择,因为这会阻塞消息泵,而更新 UI 时需要涉及消息泵。将第一个面板设置为可见时,需要消息泵泵抽取消息,以便面板及其上的组件变得可见。你应该使用计时器,就像@Charlieface提到的那样。
0赞 user16567291 5/26/2022
但是我怎样才能用计时器进行延迟呢?

答:

1赞 IVSoftware 5/26/2022 #1

我看到您想使 UI 面板在延迟时可见。要避免的一件事是 UI 线程上的任何显着延迟,因为您的表单在这段时间内将无响应,用户可能会认为它已崩溃。

一个好的方法是生成一个工作线程来执行此延迟操作,而不会阻塞 UI 线程。但是,当需要将 UI 面板更改为 UI 面板时,必须使用 Invoke 将其编组回 UI 线程。Visible

这是我用于在 C# .Net Framework 2.0 中测试此答案的代码。如果你想尝试一下,我把它贴在了 GitHub 上。

public partial class MainForm : Form
{
    public MainForm()
    {
        InitializeComponent();
    }
    protected override void OnHandleCreated(EventArgs e)
    {
        base.OnHandleCreated(e);
        new Thread(makeVisibleOnDelay).Start();
    }

    private void makeVisibleOnDelay()
    {
        Thread.Sleep(1000);
        Invoke((MethodInvoker)delegate { panel1.Visible = true; });
        Thread.Sleep(1000);
        Invoke((MethodInvoker)delegate { panel2.Visible = true; });
    }
}

现在,面板将逐步显示:

Now the panels display progressively

评论

0赞 IVSoftware 5/27/2022
我很高兴听到这个解决方案满足您的需求!我应该提到的一件事是,虽然是做这样的事情的好地方,但它可能会干扰设计师。因此,最好使用 Form 的属性检查应用是运行时还是设计时:OnHandleCreatedDesignModeif(!DesignMode) { new Thread(makeVisibleOnDelay).Start(); }