Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF MVVM防止UI锁定_Wpf_User Interface_Mvvm - Fatal编程技术网

WPF MVVM防止UI锁定

WPF MVVM防止UI锁定,wpf,user-interface,mvvm,Wpf,User Interface,Mvvm,我正在开发一个中等大小的WPF应用程序,我的第一个屏幕已经可以正常工作了,但是我想知道UI锁定的问题 现在,当打开选项卡时,我的UI不会锁定,因为我在开始时使用这样的代码从DB加载数据 await Task.Run(() => dbService.loadData()); 然而,我注意到,当我计算某件事情时,它有时会锁定,这甚至需要一点时间。或者如果我对数据库运行更新命令 我是否需要将几乎所有的东西都封装在这个奇怪的异步任务构造中?那不可能是对的 这变得特别烦人,因为我在它周围放了一个I

我正在开发一个中等大小的WPF应用程序,我的第一个屏幕已经可以正常工作了,但是我想知道UI锁定的问题

现在,当打开选项卡时,我的UI不会锁定,因为我在开始时使用这样的代码从DB加载数据

await Task.Run(() => dbService.loadData());
然而,我注意到,当我计算某件事情时,它有时会锁定,这甚至需要一点时间。或者如果我对数据库运行更新命令

我是否需要将几乎所有的东西都封装在这个奇怪的异步任务构造中?那不可能是对的

这变得特别烦人,因为我在它周围放了一个IsLoading布尔值,它绑定到一个指示符并禁用UI。禁用/启用整个用户界面。3秒会产生一种对用户不友好的闪烁效果。因此,我围绕update命令提出了这个结构

var t = new Timer(500);
t.Elapsed += (s,e) () => IsLoading = true; 
t.Start();

await Task.Run(() => dbService.UpdateData());
t.Stop();
IsLoading = false;
我觉得我没有很好地描述我的问题,但这段代码就是它


必须有更聪明/更短的方法来解决UI锁定问题。我不能每次都为了打一个电话就被迫这么做。即使将其提取到帮助器方法中,这似乎也很愚蠢。

如果您执行的处理将占用UI线程一段明显的时间,那么是的,您需要将任务转移到另一个线程,或者将其分割成不会被注意到的较小的块(async/await擅长于此)

您不必在task.Run()中包装每个任务,尽管这是一种方法。您可以有一个后台工作线程来执行所有“处理”类型的任务,而只向UI发布更新。或者,如果存在这样的情况,可以使用异步DB调用(从未完成过异步DB工作)

至于禁用UI闪烁,您需要决定是否应禁用UI。要么总是需要禁用它以确保用户在转换状态期间无法编辑,要么如果编辑不是问题,则永远不要禁用UI,并且可以选择添加忙碌的微调器,或者仅禁用某些按钮以指示正在完成的工作。目前,您遇到了一种奇怪的混合情况,可以在半秒钟内对内容进行编辑。

这是一种“更聪明”的方法,而不是用大量工作来阻止UI线程,使其无法处理输入?我不这么认为。单个线程不能同时响应用户输入和执行代码。这是不可能的。这个答案可能有用