下载时更新对话框表格

时间:2012-06-01 07:36:51

标签: c# asynchronous modal-dialog

对不起,如果标题有点不明显,我真的不能说出来。

基本上,我所拥有的是以下场景:

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

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

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

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

干杯, Ĵ

1 个答案:

答案 0 :(得分:1)

备选方案1

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

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

备选方案2

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

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

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


如果您可以自由禁用UI ...您可以在状态栏中报告进度,或者专用辅助表单(您可以让用户关闭并使用NotifyIcon返回)你有当前和任何未决的作品。