我有一个过程需要5秒钟才能完成。按下“go”按钮后,用户很可能会注意到程序闪烁几秒钟。
我的问题是:
这通常会被转储到后台工作者身上,还是有另一种.NET方法来处理小任务,或者这是不应该关注的事情?
供参考: 该过程打开一个用户指定的excel文件,处理未知数量的行(我相信excel最多150万行),并查询数据库(非常快速的查询)。因此,在最糟糕的情况下,用户上传了一个150万行excel文件,并且运行速度非常慢。
答案 0 :(得分:2)
如果您不希望用户在上传文件时能够执行任何操作,则无需将其放在其他线程上。
如果您希望用户在上传文件时能够继续执行其他任务,请将其放在不同的主题上。
作为一般的经验法则,如果我有一种情况,我绝对不希望用户在长时间运行的进程中做任何事情,我会禁用表单上的控件,直到任务完成,并且通常使用状态指示器来显示正在发生的进展。
我是否允许用户互动的个人指南是,如果流程中的用户操作可能会改变流程的结果。
例如,我们在一个高度规范化的数据库(规范化到报告为sloooow的点)上解析了一堆查询到“可报告”表中的一个程序,我不希望用户改变其中一个查询运行时的源表,因为它会产生愚蠢的结果。
如果在进程发生时允许用户交互没有任何损害,那么将其放在另一个线程中。
修改强>
实际上,在阅读@UrbanEsc和@ archer的评论时,我同意他们的看法。仍然将它放在不同的线程上并冻结控件(并尽可能包含进度指示器)。
答案 1 :(得分:1)
我会把它推给后台工作者。这样做会使UI保持响应。如果这个过程的延迟时间超过几秒钟,那么用户就会开始变得紧张......尤其是当滞后过程导致UI被“冻结”时。
答案 2 :(得分:1)
从用户体验的角度来看,最好将作业交给不同的线程或异步工作者,并告诉用户他的请求正在后台处理。工作完成后,可以根据需要处理成功/失败消息并向用户显示。
答案 3 :(得分:1)
处理问题的最便宜方法是在处理过程中将光标变为沙漏。这告诉用户请等一下,我很忙。
根据你愿意投入的预算(时间和/或努力),使用背景工作者和一些报告GUI肯定是一个加号。但是根据你的应用程序,这取决于你。
例如,我目前正在修改一个有3个用户的内部应用程序。在这种情况下,沙漏是可以的:所有3个沙漏都会很快知道他们只需要等待。不要误会我的意思:这个应用程序非常重要。没有它,使用它的小公司就会死亡。但是如果我要求他们花2小时的额外预算来获得一个漂亮且经过测试的小图形用户界面,背景线程,等同于沙漏,你认为他们会怎么说?
另一方面,如果它是您的旗舰产品中的重要操作,当然对您的用户是好的!不要犹豫:背景线程。特别是如果操作实际上可能需要比这5秒钟更长的时间。
结论:务实!
答案 4 :(得分:0)
如果你在.NET 4.0中,我会把它放到后台工作者或任务中,例如:
void OnButtonClick(...)
{
new TaskFactory().StartNew(() => { /* your excel and query code */ });
}
答案 5 :(得分:0)
我会投票支持后台工作进程,因为冻结的用户界面就像一个冻结的应用程序,大多数用户会认为你的应用程序根本没有做任何事情。
进度条或某些动画的UI主题,信息文本通知 + 后台工作线程 = 获胜
答案 6 :(得分:0)
我认为与UI本身无关的每个进程应该作为单独的thred启动,或者在这种情况下作为bg worker启动。这将有助于维护应用程序的健康,并在将来轻松改进/修复。
此外,作为用户或测试人员,我真的很讨厌轻弹和冻结窗户......
问候。
答案 7 :(得分:0)
一般的经验法则是,需要一秒或更长时间才能完成的任何操作都需要向用户提供某种形式的反馈。这可以是进度条,消息等。任何更长的时间然后用户变得沮丧(不确定他们是否做错了什么,讨厌等待等)。
对于这样的操作,根据环境(应用程序数量,可用内存,数据大小,硬盘驱动器速度等)可能需要更长的时间,它们应始终放在后台线程并将消息传递回UI。我喜欢BackGroundWorker。