有时,用户会启动一项扩展的技术操作,该操作需要一段时间才能执行。在这些情况下,通常最好显示某种进度条以及有关当前正在执行哪个任务的信息。
为了避免UI和逻辑层之间的紧密耦合,通常最好通过某种代理进行通信。也就是说,后端不应该操纵自己的UI元素,甚至不应该直接与中介层进行交互。
显然,必须在某处进行一些回调才能使此工作正常进行。我通常以两种方式之一实现它:
将可变对象传递给后端,并让后端在进行时对其进行更改。发生更改时,对象会通知前端。
传递形式
void f(ProgressObject)
或后端调用的回调函数ProgressObject -> unit
。在这种情况下,后端构造了ProgressObject
,并且完全是被动的。我认为,每次要报告进度时,它都必须构造一个新对象。
这些方法的缺点和优点是什么?有没有商定的最佳使用方法?有不同的使用环境吗?
是否有完全不同的报告进度的技术被我忽略了?
BackgroundWorker
RH提及的内容。与“进度表”等一起包装在自定义类中,并提供了一种用于传达异常的简单机制-按照BackgroundWorker
设计,该机制在单独的线程中运行。在某种程度上,我们以.Net建议的方式使用其功能,因此可以说是惯用的。并且在任何给定的语言/框架上下文中,“惯用”可能是最好的。