微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

WPF - 数据库操作期间 UI 锁定EF6,async/await

如何解决WPF - 数据库操作期间 UI 锁定EF6,async/await

所以我正在开发一个 WPF 应用程序,它在启动时执行一些数据库操作,最近决定添加一个包含“isIndeterminate”ProgressBar 的 SplashScreen 作为应用程序正在执行后台任务的视觉指示器。

但是,如果不冻结 UI 线程,我就无法让它工作。第一次与 async / await 合作,非常感谢您的帮助。 (如果相关,请使用 EF6 和本地安装的 MS sql Server 2019)

这是我的代码

public partial class App : Application
{
    private const int minSplashTime = 2000;

    protected async override void OnStartup(StartupEventArgs e)
    {
        SplashScreenWindow splash = new SplashScreenWindow();
        splash.Show();

        base.OnStartup(e);
        MainWindow mainWindow = new MainWindow();

        Stopwatch timer = new Stopwatch();
        timer.Start();

        await AsyncDbTask();

        timer.Stop();

        // Wait remainingTime if minSplashTime is not reached yet
        int remainingTime = minSplashTime - (int)timer.ElapsedMilliseconds;
        if (remainingTime > 0)
        {
            await Task.Delay(remainingTime);
        }

        splash.Close();
        mainWindow.Show();
    }

    private async Task AsyncDbTask()
    {
        using (DatabaseContext db = new DatabaseContext())
        {
            // PERFORMING DB OPERATIONS HERE
            // [...]

            await db.SaveChangesAsync();
        }
    }
}

解决方法

仅仅因为方法返回 Task<T> 并不意味着它实际上是异步运行的。某些数据库引擎不支持异步查询,并且会同步运行所有内容。即使您的数据库确实支持真正的异步查询,也不一定意味着它无法同步完成或不会在调用者线程上执行大量工作。

一种解决方法是使用 Task.Run

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。