C# 反应式扩展:使用Rx创建与文件一起工作的管道

C# 反应式扩展:使用Rx创建与文件一起工作的管道,c#,.net,system.reactive,idisposable,ziparchive,C#,.net,System.reactive,Idisposable,Ziparchive,我有一个包含三个步骤的流程管道: 视频到图像:我有一个视频转换为静态图像 (框架) 帧到zip文件:当视频中的所有帧都被处理后,我应该用它们创建一个zip文件 zip文件=>上传到FTP 它包括两个一次性文件:视频捕获和zip文件 我如何使用Rx处理它?我不知道如何开始。您是否必须从每个步骤传递原始对象。 视频捕获或zip文件被“处理”应该没问题,因为我确信该操作会产生一些副作用(一个内存流、一个写入磁盘的文件等)。 您可以将每个操作的结果的指针(Uri?)传递到管道的下一部分 void Mai

我有一个包含三个步骤的流程管道:

  • 视频到图像:我有一个视频转换为静态图像 (框架)
  • 帧到zip文件:当视频中的所有帧都被处理后,我应该用它们创建一个zip文件
  • zip文件=>上传到FTP
  • 它包括两个一次性文件:视频捕获和zip文件


    我如何使用Rx处理它?我不知道如何开始。

    您是否必须从每个步骤传递原始对象。 视频捕获或zip文件被“处理”应该没问题,因为我确信该操作会产生一些副作用(一个
    内存流、一个写入磁盘的文件等)。
    您可以将每个操作的结果的指针(Uri?)传递到管道的下一部分

    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()
    }   
    
    void Main()
    {
    var video=新Uri(“https://www.youtube.com/watch?v=Tp5mRlHwZ7M");
    var query=从转码视频中的帧到图像(视频)
    从zipFile到zipFile(帧)
    来自UploadFile(zipFile)中的uploadLocation
    选择上传位置;
    query.Subscribe(…)
    }
    私有IObservable转码视频到图像(Uri imageSource)
    {
    //在这里执行一些长时间运行(异步)工作。
    //将工作保存到磁盘
    //返回已保存工作的位置
    }
    私有IObservable ZipFiles(Uri[]文件)
    {
    //对所有文件运行zip进程
    //返回zip文件的位置
    }
    私有IObservable上载文件(Uri源)
    {
    //上传文件。
    //可能与使用.ToObservable()的基于任务的操作一样简单
    }   
    
    首先将代码分解为这三个步骤。接下来,确保每个方法都返回一个
    IObservable
    ,以表示转码/压缩/上传的异步性质。最后,使用SelectMany/Concat/Merge/etc使用这3种方法创建接收管道。谢谢,李!问题是,我不知道创建一个IObservabe是否真的有意义,因为这个抽象并不真正代表数据,而是一个创建.zip的抽象。如果我成功地创建了这种可观察的对象,我将收到一个处理过的ZipArchives流。更一般地说,我觉得最终到达文件系统的投影会变得很棘手。也许,实现这一点的一种方法是投影一个表示视频名称的令牌(字符串),并使用do创建一个Zip并将令牌传递到管道中的下一步。最后,订户将收到令牌,以了解要上载的文件。