【问题标题】:Run a batch of processes and report progress from each of them运行一批进程并报告每个进程的进度
【发布时间】: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 分钟甚至更长时间。平均为一分钟或更短。

现在我的问题是

  1. 如何限制同时处理的进程数量(我必须这样做吗?或者我应该逐个加密它们)?
  2. 这是执行此操作的有效方法吗?也许有一个完全不同的更好的方法?
  3. 如何确保在 ViewModel 关闭时公开所有这些进程(驻留在 VM 中的包装器中)(我已尽我所能在加密后内部处理资源(即加密过程本身)但我让包装器实现了IDisposable,我不确定在VM 上实现IDisposable 是否正确,我错了。

非常感谢任何关于这个故事的设计或实践指导/参考样本!

*丢弃

【问题讨论】:

    标签: .net multithreading mvvm process progress


    【解决方案1】:

    1. 2.
    我强烈建议您查看 MSDN 上的 How to: Use a Thread Pool (C# and Visual Basic)
    尤其是 ThreadPoolExample 类 - 它可以解决您的问题

    3.
    如果您的意思是“在视图/VM 关闭后继续加密”:在静态类中创建 TreadPool-handling。

    【讨论】:

    • 响应 3 - 不 - 在 VM 关闭后它永远不应该转换。我只是想确保当 VM 关闭时(或者甚至更多 - 从列表中删除该项目),它应该处理底层包装器-> 进程),基本上我需要知道对 VM 有更多控制权,我认为这是一个单独的问题,即“如何使用 Prism 处理 VM”,我相信我会在 Google 上找到一些信息。谢谢。
    • 请看this的帖子。你确定我应该使用ThreadPool吗?我真的很想,问题是这是否是个好主意。
    【解决方案2】:

    在一项服务中生成报告时,我们遇到了类似的问题,可以同时请求数十个长时间运行的报告。我们处理资源消耗的方式是我们将每个报告分流到它自己的线程中,但将执行线程的最大数量限制为一个设定的数量。

    生成的每个线程都使用在生成时分配给线程的键记录在字典变量中。主控制进程执行连续循环(每个循环可能休眠 100 毫秒)并检查每个正在运行的线程是否完成。

    一旦一个线程被识别为已完成,它就会从字典中删除,队列中的下一个线程会生成一个新线程。

    由于执行线程列表始终可用,我们可以优雅地处理提前终止请求和其他异常活动。如果我们需要向用户提供流程,那么嵌入到活动流中会非常容易。

    作为参考,生成的报告线程实际上是包含它们正在执行的 Thread 对象的类。这使我们能够控制线程或向父进程提供反馈,而无需跳过很多环节(只需确保同步从线程外部和内部访问的任何资源)。

    【讨论】:

    • 我决定使用ThreadPool。它确实为我完成了这项工作。查看迈克尔的答案。
    猜你喜欢
    • 2011-06-12
    • 2020-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-28
    • 1970-01-01
    • 2019-04-30
    相关资源
    最近更新 更多