对用户体验的看法- c# Winforms

本文关键字:Winforms 看法 用户 体验 | 更新日期: 2023-09-27 18:06:37

我有一个过程,这将需要不到5秒来完成。用户很可能会注意到,在按下"go"按钮后,程序会闪烁几秒钟。

我的问题是:

这是一些通常会被倾倒到后台工作,或者有另一个。net方法来处理小任务,或者这是不应该被关注的事情?

供参考:该进程打开用户指定的excel文件,处理未知数量的行(由于excel,我相信最多150万行),并查询数据库(非常快速的查询)。因此,在最坏的情况下,用户上传了一个150万行的excel文件,并且在非常慢的互联网连接上运行。

对用户体验的看法- c# Winforms

如果您不希望用户在上传文件时能够做任何事情,那么您不需要将其放在不同的线程上。

如果你希望用户在上传文件的时候可以继续做其他的任务,把它放在一个不同的线程上。

作为一般的经验法则,如果我有一种情况,我绝对不希望用户在长时间运行的过程中做任何事情,我禁用表单上的控件,直到任务完成,并且通常使用状态指示器来显示正在发生的进展。

对于是否允许用户交互,我个人的指导原则是,如果流程的结果可能被用户在流程中的操作所改变。

例如,我们有一个程序,将高度规范化的数据库上的一堆查询解析为"可报告的"表,我不希望用户在查询运行时修改其中一个源表中的数据,因为它会给出愚蠢的结果。

如果在进程发生时允许用户交互没有害处,则将其放在另一个线程中。

编辑

实际上,在阅读@UrbanEsc和@archer的评论时,我同意他们的观点。仍然将其放在不同的线程中并冻结控件(并在可能的情况下包含进度指示器)。

我会把它推送给后台worker。这样做将保持UI的响应性。如果进程延迟超过几秒钟,用户就会开始紧张,尤其是当进程延迟导致UI被"冻结"的时候。

从用户体验的角度来看,最好将任务移交给不同的线程或异步工作线程,并告诉用户他的请求正在后台处理。一旦worker完成,就可以处理成功/失败消息,并根据需要显示给用户。

处理这个问题最便宜的方法是在处理过程中将光标变成一个沙漏。告诉用户请稍等,我很忙

根据您愿意投入的预算(时间和/或精力),使用后台工作器和一些报告GUI当然是加分项。但这取决于你的应用程序。

例如,我目前正在修改一个有3个用户的内部应用程序。在这种情况下,沙漏是可以的:他们三个很快就会知道他们只需要等待。不要误解我的意思:这个应用程序非常重要。没有它,使用它的小公司就会消亡。但如果我要求他们额外提供2小时的预算来制作一个经过测试的小GUI、后台线程等等,你觉得他们会怎么说?

另一方面,如果这是你的旗舰产品中的一个重要操作,当然要对你的用户好!不要犹豫:后台线程。特别是如果操作实际需要的时间可能比这5秒长得多。

结论:要务实!

如果你是在。net 4.0中,我会把它放在一个后台worker或一个任务的fire中,例如:

void OnButtonClick(...)
{
    new TaskFactory().StartNew(() => { /* your excel and query code */ });
}

我将投票给后台工作进程,因为冻结的UI就像冻结的应用程序,大多数用户会认为你的应用程序根本没有做任何事情。

UI线程用于进度条或一些动画,info text注意到正在发生的事情 + 后台工作线程 = win

我认为每个与UI本身不相关的进程都应该作为单独的线程启动,或者在这种情况下,作为bg worker。这将有助于保持应用程序的健康,并易于在未来改进/修复。

而且,作为用户或测试人员,我真的很讨厌弹窗和冻结窗口…

问候。

一般的经验法则是,任何需要一秒钟或更长时间才能完成的操作都需要向用户提供某种形式的反馈。它可以是进度条、消息等。超过这个时间,用户就会感到沮丧(不确定自己是否做错了什么,讨厌等待等等)。

对于这样的操作,根据环境(应用程序数量,可用内存,数据大小,硬盘驱动器速度等)可能需要更长的时间,它们应该始终放在后台线程上,并将消息管道回UI。我喜欢BackGroundWorker。