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
我如何使用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并将令牌传递到管道中的下一步。最后,订户将收到令牌,以了解要上载的文件。