2016-06-20 2 views
2

ich eine Prozess-Pipeline mit 3 Schritten haben:Reactive Extensions: eine Pipeline mit Rx Erstellen, die mit Dateien arbeitet

  1. Video Bilder: Ich habe ein Video, das Bilder auf noch umgewandelt wird (Frames)
  2. Frames in zip-Datei: Wenn alle Frames in einem Video verarbeitet wurden, sollte ich eine Zip-Datei mit ihnen erstellen.
  3. zip file => Laden

Es beinhaltet 2 Disposables FTP: die Videoaufnahme und die Zip-Datei.

Wie könnte ich mit Rx umgehen? Irgendwelche Ideen? Entschuldigung dafür, dass ich keinen Code gepostet habe, ich weiß nicht, wie ich anfangen soll.

Vielen Dank im Voraus!

+0

Beginnen Sie damit, den Code in genau diese drei Schritte zu zerlegen. Stellen Sie als nächstes sicher, dass jede dieser Methoden ein IObservable zurückgibt, um die asynchrone Art des Transcodierens/Zipping/Uploads darzustellen. Verwenden Sie schließlich SelectMany/Concat/Merge/etc, um eine Rx-Pipeline mit diesen drei Methoden zu erstellen. –

+0

Danke, Lee! Die Sache ist, dass ich nicht weiß, ob es wirklich Sinn macht, eine IObservabe zu erstellen, da diese Abstraktion nicht wirklich Daten darstellt, sondern eine Abstraktion zum Erstellen einer .zip. Wenn es mir gelingt, diese Art von Observablen zu erstellen, würde ich einen Strom von entsorgten ZipArchiven erhalten. – SuperJMN

+0

Allgemeiner denke ich, dass eine Projektionen, die am Ende auf das Dateisystem treffen, am Ende schwierig sind. Vielleicht besteht die Möglichkeit, ein Token (String) zu projizieren, das den Namen des Videos darstellt, und mit Do, um eine Zip-Datei zu erstellen und das Token an den nächsten Schritt in der Pipeline zu übergeben. Schließlich erhält der Abonnent das Token, um zu wissen, welche Datei hochgeladen werden soll. – SuperJMN

Antwort

5

Müssen Sie die rohen Objekte von jedem Schritt weitergeben. Es sollte in Ordnung sein, dass die Videoaufnahme oder die Zip-Datei "entsorgt" werden, weil ich sicher bin, dass es einen Nebeneffekt der Aktion geben würde (eine MemoryStream, eine auf die Festplatte geschriebene Datei usw.). Sie können nur die Zeiger (Uri's?) Auf die Ergebnisse jeder Aktion zum nächsten Teil der Pipeline weitergeben?

void Main() 
{ 
    var video = new Uri("https://www.youtube.com/watch?v=Tp5mRlHwZ7M"); 
    var query = from frames in TranscodeVideoToImages(video) 
     from zipFile in ZipFiles(frames) 
     from uploadLocation in UploadFile(zipFile) 
     select uploadLocation; 
    query.Subscribe(...) 
} 
private IObservable<Uri[]> TranscodeVideoToImages(Uri imageSource) 
{ 
    //Do some long running (async) work here. 
    // Save work to disk 
    // Return location of saved work 
} 
private IObservable<Uri> ZipFiles(Uri[] files) 
{ 
    //Run the zip process on all of the files 
    // Return the location of the zip file 
} 
private IObservable<Uri> UploadFile(Uri source) 
{ 
    //Upload the File. 
    //Probably as simple as as task based operation with .ToObservable() 
} 
Verwandte Themen