Dataflow mit Aufteilung der Arbeit auf kleine Jobs und anschließendem erneutem Gruppieren

Ich muss diese Art von Arbeit machen:

Get Page Objekt aus der DatenbankFür jede Seite werden alle Bilder abgerufen und verarbeitet (E / A-gebunden, z. B. zum Hochladen auf CDN).Wenn alle Bilder erfolgreich verarbeitet wurden, markieren Sie die Seite als in der Datenbank verarbeitet.

Da ich steuern muss, wie viele Seiten ich parallel verarbeite, habe ich mich für TPL Dataflows entschieden:

 ____________________________
|         Data pipe          |
|   BufferBlock<Page>        |
|   BoundedCapacity = 1      |
|____________________________|
              |
 ____________________________
|       Process images       |
| TransformBlock<Page, Page> |
| BoundedCapacity = 1        |
| MaxDegreeOfParallelism = 8 |
|____________________________|
              |
 ____________________________
|        Save page           |
| ActionBlock<Page>          |
| BoundedCapacity = 1        |
| MaxDegreeOfParallelism = 5 |
|____________________________|

Nun brauche ich die Option "Bilder verarbeiten", um Bilder parallel zu verarbeiten, aber ich möchte einschränken, wie viele Bilder ich derzeit auf allen parallelen Seiten in Arbeit verarbeitet habe.

Ich kann TrasnformManyBlock für "Prozessbilder" verwenden, aber wie sammle ich sie wieder im Block "Seite speichern"?

         ____________________________
        |         Data pipe          |
        |   BufferBlock<Page>        |
        |   BoundedCapacity = 1      |
        |____________________________|
                      |
     ___________________________________
    |           Load images             |
    | TransformManyBlock<Page, Image[]> |
    | BoundedCapacity = 1               |
    | MaxDegreeOfParallelism = 8        |
    |___________________________________|
      /              |              \
   ______________________________________________
 _|____________________________________________  |
|              Process image                   | |
| TransformBlock<ImageWithPage, ImageWithPage> | |
| BoundedCapacity = 1                          | |
| MaxDegreeOfParallelism = 8                   |_|
|______________________________________________|
      \              |               /
         How to group images by page ?
                     |
        ____________________________
       |        Save page           |
       | ActionBlock<Page>          |
       | BoundedCapacity = 1        |
       | MaxDegreeOfParallelism = 5 |
       |____________________________|

Darüber hinaus kann möglicherweise eines der Bilder nicht fortgesetzt werden, und ich möchte keine Seite mit fehlgeschlagenen Bildern speichern.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage