作为我们应用程序的一部分(现在生产大约 4 个月),我们有一个来自外部设备的数据流,我们将其转换为 IObservable
到目前为止,我们一直在使用以下内容来生成它,并且效果很好。
IObservable<string> ObserveStringStream(Stream inputStream)
{
var streamReader = new StreamReader(inputStream);
return Observable
.Create<string>(observer => Scheduler.ThreadPool
.Schedule(() => ReadLoop(streamReader, observer)));
}
private void ReadLoop(StreamReader reader, IObserver<string> observer)
{
while (true)
{
try
{
var line = reader.ReadLine();
if (line != null)
{
observer.OnNext(line);
}
else
{
observer.OnCompleted();
break;
}
}
catch (Exception ex)
{
observer.OnError(ex);
break;
}
}
}
昨晚我想知道是否有一种方法可以使用yield return
语法来实现相同的结果并想出了这个:
IObservable<string> ObserveStringStream(Stream inputStream)
{
var streamReader = new StreamReader(inputStream);
return ReadLoop(streamReader)
.ToObservable(Scheduler.ThreadPool);
}
private IEnumerable<string> ReadLoop(StreamReader reader)
{
while (true)
{
var line = reader.ReadLine();
if (line != null)
{
yield return line;
}
else
{
yield break;
}
}
}
它似乎工作得很好,而且更干净,但我想知道一种方式是否比另一种方式有任何优点或缺点,或者是否有更好的方法。