2

对不起,如果标题有点不伦不类,我真的说不出来。

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

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

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

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

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

干杯,J

4

1 回答 1

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 的自由...您可以在状态栏中报告进度,或者您拥有当前和任何未决的作品。

于 2012-06-01T07:52:57.957 回答