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

WPF-在后台运行长时间操作时更新元素

如何解决WPF-在后台运行长时间操作时更新元素

我正在构建一个简单的WPF应用程序,并且在该应用程序中的许多地方,我都进行了很长时间的操作,在此期间我想更新UI,以使它看起来不会像应用程序崩溃一样。 例如,我有一个登录”按钮,当我按下该按钮时,除了验证所有凭据外,它还将加载该特定用户数据的二进制数据库。对于拥有大量数据的用户来说,这可能需要3-5秒,而对于另一个用户来说,这可能是即时的。

我想要的是能够在完成Button Click事件之前更新其他元素,而我希望按照代码的确切顺序进行操作。

这是“登录”按钮的单击事件:

private void btnLogin_Click(object sender,RoutedEventArgs e) {
            var username = txtUsername.Text;
            var password = pswBox.Password;
            lblLoginStatus.Visibility = Visibility.Visible;
            if (string.IsNullOrWhiteSpace(username) || string.IsNullOrWhiteSpace(password)) {
                lblLoginStatus.Content = "Both username and password cannot be empty!";
            } else {
                prgLogin.Visibility = Visibility.Visible; //Progress bar that should be visible while the long operation is running.
                var login = Adb.Login(username,password); //Long operation
                prgLogin.Visibility = Visibility.Collapsed; //Upon completion of the operation,hide the progress bar.
                if (!login) {
                    lblLoginStatus.Content = "Wrong Credentials!";
                } else { //This basically exits the login page/window
                    LoginPage.Visibility = Visibility.Collapsed;
                    GeneralPage.Visibility = Visibility.Visible;
                }
            }
        }

您可以看到我没有看任何精美的动画甚至进度报告。进度条是不确定的,我为它设置了样式,因此它只是以可见性触发器开始和结束。

我的问题是,按我的逻辑,在按下按钮之后,代码实际上按照与编写时相同的顺序运行,它看起来像是卡住了,在操作结束之前没有其他元素被更新,此时登录窗口隐藏起来,使我全力以赴创建一个毫无价值的愉快UI。

我尝试使用:

dispatcher.Currentdispatcher.Invoke(/*Whatever element update I want*/);

但这没有帮助,结果是一样的...

我在网上看到了类似问题的一些复杂而又长期的解决方案,即使是为了测试,我也试图实施它们,但直到现在我花了大约4个小时弄乱了它。

与我的应用程序其余部分一样,它充满了诸如以下内容

progressBar.Visibility = Visibility.Visible;
var operation = AnyLongOperation()
prgLogin.Visibility = Visibility.Collapsed;

因此,我正在寻找一种简单的解决方案,以便能够在整个应用程序中进行调整。

解决方法

UI冻结,因为您的程序在一个线程上运行,Adb.Login阻塞了主线程,因此无法更新UI,您必须将Login函数移至另一个线程并从那里更新进度,{{ 3}}应该会有所帮助,实现起来并不太复杂,或者只是使登录方法异步

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