如何避免结巴/延迟ui

本文关键字:延迟 ui 何避免 | 更新日期: 2023-09-27 17:50:48

我有一个简单的应用程序,读取一个数据库,然后在一些操作后将结果写入另一个数据库。

代码的第一行用用户消息和屏幕上的日志更新ui,然后全部包装在一个try/catch结构中,并添加了using和其他try/catch。

message.AppendText("** Message for the user that appear only after the try block's execution **'n");
message.ScrollToEnd();
try
{
    using(SqlConnection...)
    {
        business code
    }
}
catch
{
    bbbb...
}

最后它工作了,但是ui只有在它完成后才更新。我可以理解为什么里面的东西必须等待结束,但是为什么第一行不影响ui直到连续块的结束?

如何创建响应性更强的ui?我首先尝试为任何连接创建一个线程(一个有5秒的超时),一个为业务代码创建一个线程。好吧,虽然有点过分,但还是在试验。我在共享线程之间的连接以及与主窗口ui交互时遇到了很多问题,所以我放弃了这个想法,并按照上面的描述重写了所有内容。

如何避免结巴/延迟ui

这里的人建议创建一个响应式UI。这是一种方法。在代码文件的顶部,添加:

using System.Threading;

将所有耗时较长的内容移到新方法中:

public void LoadStuff()
{
    // Do some stuff that takes a while here
}

用下面的代码替换原来的内容:

Thread callThread = new Thread(new ThreadStart(LoadStuff));
callThread.Start();

现在,任何时候你需要从LoadStuff更新你的UI,你必须用这段代码封装它(包围它)。这样做的原因是只有创建UI的线程可以修改它。因此,我们必须告诉新线程引用旧线程来执行代码。因此,在LoadStuff中,在你计算了一堆数据之后,要更新你的UI,使用这个:

this.Dispatcher.Invoke(new Action(() =>
{
    // Code to update UI here
}));

就像其他人建议的那样,还有其他方法可以提高UI速度,我并不是第一个建议使用不同线程来计算的人。但我只是想给你们展示一种方法

除了将长时间运行的进程移出UI线程之外,您还可以使用一些UI技巧来帮助使用户交互感觉更好一些。例如,如果一个动作花费的时间超过0.1秒,那就尝试淡入消息(例如:"Loading…")让用户知道正在发生一些事情。一旦您获得数据,将此消息淡出。

你可能还想尝试动画UI更新,以避免"口吃"的感觉。