我正在寻找一种“整洁”高效的方法来完成以下操作:先进行一个长时间的步骤1(可以并行处理),然后进行一个需要按照原始顺序进行的步骤2(如果可能,最小化在RAM中保留第一步骤数据的量),同时允许第二步骤在第一个对象的步骤1数据可用时开始,并且继续处理更多数据的步骤2。
为了更加清晰明了地表达,我需要压缩大量图片(较慢-步骤1),然后按顺序(步骤2)通过网络连接发送每张图片。在任何阶段限制RAM中准备好的压缩数据块的数量也很重要,因此例如,如果要发送1000张图片,则希望将“已完成但未发送”的图片数量限制为使用的线程/处理器数。
我已经手写了一个版本,使用了Task对象数组,但它看起来很混乱,而且我相信其他人肯定有类似的需求,所以是否有更“标准”的方法来完成这个任务呢?理想情况下,我希望有一个Parallel.ForEach的变体,其中包含两个委托-一个用于步骤1,另一个用于步骤2,并且我希望其中一个标准重载(例如包括“localFinal”参数的重载)可能会有所帮助,但事实证明这些最终阶段是“每个线程”,而不是“每个委托”。
有人能指出一个现有的优雅方法来完成这个任务吗?
为了更加清晰明了地表达,我需要压缩大量图片(较慢-步骤1),然后按顺序(步骤2)通过网络连接发送每张图片。在任何阶段限制RAM中准备好的压缩数据块的数量也很重要,因此例如,如果要发送1000张图片,则希望将“已完成但未发送”的图片数量限制为使用的线程/处理器数。
我已经手写了一个版本,使用了Task对象数组,但它看起来很混乱,而且我相信其他人肯定有类似的需求,所以是否有更“标准”的方法来完成这个任务呢?理想情况下,我希望有一个Parallel.ForEach的变体,其中包含两个委托-一个用于步骤1,另一个用于步骤2,并且我希望其中一个标准重载(例如包括“localFinal”参数的重载)可能会有所帮助,但事实证明这些最终阶段是“每个线程”,而不是“每个委托”。
有人能指出一个现有的优雅方法来完成这个任务吗?
AsOrdered
和AsSequential
正是设计用来解决这类问题的。你考虑过使用PLINQ吗? - Damien_The_Unbeliever