C# IObservable<;字节[]>;转换
如何将IObservable转换为字节[] 我想将IObservable转换为wav文件并将其保存在磁盘上C# IObservable<;字节[]>;转换,c#,C#,如何将IObservable转换为字节[] 我想将IObservable转换为wav文件并将其保存在磁盘上 DisOutput d; File.WriteAllBytes("outputsend.wav", d); 我有一个数组IObservable,我想把它转换成byte[],这样我就可以写入文件了。如何将IObservable转换为byte[],因为writealBytes将byte[]作为输入我假设您有一个框架,可以动态地以IObservable的形式生成WAV文件。大概,当生成完成时,
DisOutput d;
File.WriteAllBytes("outputsend.wav", d);
我有一个数组IObservable,我想把它转换成byte[],这样我就可以写入文件了。如何将IObservable转换为byte[],因为writealBytes将byte[]作为输入我假设您有一个框架,可以动态地以
IObservable
的形式生成WAV文件。大概,当生成完成时,IObservable
将触发OnCompleted
以发出此信号
IObservable<Byte> observable;
发生的情况是,ToList
操作符将收集随时间增长的列表中的所有传入字节。当传入序列完成时,将通知订阅者,在这种情况下,字节列表将写入文件
但是,不需要在内存中缓冲字节。相反,它们可以直接写入文件。重要的是,当传入的字节流完成时关闭文件,这可以通过使用这种稍微更复杂但也更有效的扩展方法来实现:
static class ObservableExtensions {
public static IObservable<Unit> WriteToFile(this IObservable<Byte> source, String fileName) {
return Observable.Create<Unit>(
observer => {
var fileStream = new SerialDisposable();
return new CompositeDisposable(
source.Subscribe(
value => {
try {
if (fileStream.Disposable == null)
fileStream.Disposable = File.Create(fileName);
((FileStream) fileStream.Disposable).WriteByte(value);
}
catch (SystemException ex) {
observer.OnError(ex);
}
},
observer.OnError,
() => {
observer.OnNext(Unit.Default);
observer.OnCompleted();
}
),
fileStream
);
}
);
}
}
要处理错误,您可以使用另一个重载Subscribe
:
observable.WriteToFile("outputsend.wav").Subscribe(
_ => Console.WriteLine("Done"),
ex => Console.WriteLine(ex)
);
这将向控制台写入异常。生产质量应用程序需要更复杂的方法。您能提供更多详细信息吗?不确定你想完成什么,不太清楚。显示DisOutput的类def,并明确字节的编码。我有一个数组IObservable,我想将其转换为byte[],以便可以写入一个非常好的文件。您能解释一下类中的“单位”是什么吗?@user2837961:
IObservable
提供了T
类型的事件序列。通常,此类型包含一些描述事件的数据,但有时您需要一个没有数据的void
事件。在这种情况下,您可以使用单元
。
observable.WriteToFile("outputsend.wav").Subscribe(_ => Console.WriteLine("Done"));
observable.WriteToFile("outputsend.wav").Subscribe(
_ => Console.WriteLine("Done"),
ex => Console.WriteLine(ex)
);