【发布时间】:2011-12-19 22:44:19
【问题描述】:
我有一个要加密的文件列表。
加密是由外部控制台应用程序进程报告必须解析的进度进行的。
这个进度必须异步启动(处理 OutputDataReceived 事件的 Process.BeginOutputReadLine 是我可以从这个过程中获得实时进度的唯一方法)。
场景:
对于用户选择加密的每个文件,将包含此文件信息的ViewModel 实例添加到ListBox。用户添加了 100 个文件进行加密。每个ViewModels 都有一个Encrypt 命令(我使用Prism DelegateCommand),当用户单击列表项上的“加密”按钮时应触发该命令。
除此之外,用户还可以选择单击“全部加密”,这是父容器中的CompositeCommand,它对每个单独的项目调用加密命令。
列表中的每个项目都有一个进度条指示该单个文件的加密过程,并且父容器中还有一个进度条应该显示整体进度。
我制作了一个包装器,它异步调用该进程并在每次进度更改时触发一个 .NET 事件,VM 处理该事件并更新进度条绑定到的进度属性,该事件也由父容器处理这会在每次进度更改时重置摘要整体进度条。
此包装器公开了启动底层进程的“EncryptAsync”函数。
每个项目(VM)都有一个包装器,当调用 Encrypt 命令时,它会在包装器上调用此方法,然后创建一个进程等。
所以基本上当用户点击 Encrypt All 时,会启动 100 个进程。
为了确保每个文件的加密可能需要 10 分钟甚至更长时间。平均为一分钟或更短。
现在我的问题是:
- 如何限制同时处理的进程数量(我必须这样做吗?或者我应该逐个加密它们)?
- 这是执行此操作的有效方法吗?也许有一个完全不同的更好的方法?
- 如何确保在 ViewModel 关闭时公开所有这些进程(驻留在 VM 中的包装器中)(我已尽我所能在加密后内部处理资源(即加密过程本身)但我让包装器实现了
IDisposable,我不确定在VM 上实现IDisposable是否正确,我错了。
非常感谢任何关于这个故事的设计或实践指导/参考样本!
*丢弃
【问题讨论】:
标签: .net multithreading mvvm process progress