下载时更新对话框表单

本文关键字:表单 对话框 更新 下载 | 更新日期: 2023-09-27 18:36:03

对不起,如果标题有点不起眼,我真的说不对。

基本上,我有以下情况:

我有一个用户界面(WinForm),允许用户选择要下载的多个文件,然后点击"下载"按钮开始下载。所有下载都是异步处理的,以避免锁定表单。但是,虽然我不希望表单锁定并显示"未响应"消息,但我也不希望用户能够在下载运行时修改表单字段。

理想情况下,我想生成一个模态对话框,让用户知道下载的状态(即类似于 firefox,除了有模态对话框)。这用一块石头杀死了 2 只鸟,因为它允许用户很好地查看下载进度,同时还会在对话框处于活动状态时阻止用户与父表单交互。

但是,为了正确地让用户了解下载进度,我需要在运行时更新对话框。这就是我碰壁的地方。我目前的想法是公开我的对话框类的一些公共方法,以便在文件完成时向其发送更新,并从后台下载线程中调用它们(使用适当的委托来更新控件等)

我很确定这会按照我的意愿工作,但我只是想知道是否有更优雅的解决方案来解决这个问题。不要局限于对话方法,我对所有可能提供更好的选择的方法持开放态度。

干杯J

下载时更新对话框表单

备选方案 1

您可以考虑使用 BackgroundWorker,它将需要设置一个新线程来完成工作,并提供基于事件的机制来报告进度,以及请求取消操作的方法(如果您想使用它,这取决于您)。

若要为 BackgroundWorker 设置任务,需要将处理程序附加到事件DoWork,然后调用 RunWorkerAsync()

备选案文2

另一种方法是使用 IObservable<T> 创建响应下载进度的机制,然后可以使用 React 进行绑定。

我认为你是反应式的新手。在这种情况下,这是最好的介绍(在我看来):

http://channel9.msdn.com/Blogs/codefest/DC2010T0100-Keynote-Rx-curing-your-asynchronous-programming-blues


如果您有不禁用 UI 的自由...您可以在状态栏上报告进度,或者专用于辅助表单(您可以让用户关闭并使用 NotifyIcon 返回),您可以在其中保存当前和任何待处理的工作。