📜  在不阻塞 UI 执行的情况下等待几秒钟 - C# (1)

📅  最后修改于: 2023-12-03 14:51:23.394000             🧑  作者: Mango

在不阻塞 UI 执行的情况下等待几秒钟 - C#

在 C# 中,等待几秒钟并不是一个难题,但同时不阻塞 UI 界面的执行,就需要使用异步编程。

使用异步编程模型(Async/Await)

使用异步编程模型的方式是,我们可以在 UI 线程中使用 asyncawait 关键字来等待某个异步操作的完成。

例如,我们可以使用 Task.Delay() 方法来等待几秒钟,代码如下:

private async void WaitSecondsAsync()
{
    // 暂停执行 5 秒钟
    await Task.Delay(5000);
    MessageBox.Show("等待完成!");
}

上述代码中,WaitSecondsAsync() 方法是异步的,执行到 await Task.Delay(5000) 时,会暂停当前方法的执行,等待 5 秒钟后再继续执行。

使用 Task.Run()

除此之外,我们还可以使用 Task.Run() 方法来将耗时的操作移到另外一个线程中执行,以避免阻塞 UI 线程。

例如,我们可以编写如下的代码:

private async void WaitSecondsAsync()
{
    await Task.Run(() =>
    {
        // 模拟执行一个耗时的操作
        Thread.Sleep(5000);
    });

    MessageBox.Show("等待完成!");
}

上述代码中,我们使用 Task.Run() 方法将 Thread.Sleep(5000) 移到了另外一个线程中执行,这样就避免了阻塞 UI 线程的情况。

异步委托

除了 async/awaitTask.Run(),我们还可以使用异步委托来执行耗时的操作。

例如,我们可以定义一个异步委托:

public delegate Task MyAsyncDelegate();

然后,我们可以在 UI 线程中使用该异步委托来等待耗时操作的完成:

private async void WaitSecondsAsync()
{
    MyAsyncDelegate asyncDelegate = async () =>
    {
        // 暂停执行 5 秒钟
        await Task.Delay(5000);
        MessageBox.Show("等待完成!");
    };

    await asyncDelegate();
}

上述代码中,我们先定义了一个异步委托 MyAsyncDelegate,然后在 UI 线程中使用该异步委托来执行异步操作。这样,就可以在不阻塞 UI 线程的情况下等待几秒钟了。

总结

在不阻塞 UI 执行的情况下等待几秒钟,可以使用异步编程模型、Task.Run() 方法或异步委托来实现。在使用异步编程模型时,建议使用 async/await 关键字,以让代码更加清晰易懂。