私たちのアプリケーションの一部として (現在約 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;
}
}
}
それは非常にうまく機能しているようで、はるかにクリーンですが、一方の方法に別の方法の長所または短所があるかどうか、または完全に優れた方法があるかどうか疑問に思っていました.