簡體   English   中英

反應框架消除了Observable.Create中的while循環

[英]Reactive framework eliminate while loop in Observable.Create

我正在處理從網絡傳來的可觀察字節流,我希望將其用於一層抽象。 該格式有兩個字節,其中包含下一條消息的長度。 我想很好地使其適應於反應式框架。 到目前為止,我感覺還不太對,所以我想知道我可能錯過了哪些技巧來消除while循環。

這是我想到的概念:

public static IObservable<Stream> GetToplevelStreams(IObservable<byte> byteStreamArg) {
    return Observable.Create((IObserver<Stream>o)=>{
        bool done = false;
        var byteStream = byteStreamArg.Do(
            b => { }, (ex) => { done = true; }, () => { done = true; });
        while (!done)
        {
            var size = byteStream.Take(2).
                           Aggregate(0, (n, b) => (n << 8) + b).Single();
            var buf = byteStream.Skip(2).Take(size);
            var stream = new MemoryStream(buf.ToEnumerable().ToArray());
            if (!done)
            {
                o.OnNext(stream);
            }
        }
        return (() => {});
    });
}

IObservable在這里有點奇怪-記住您要返回“流的未來列表”-實際上我只是返回Stream ,或者可能是IObservable<byte[]> ,其中每個數組代表一條消息。 甚至做得更好,並返回IObservable<ParsedMessage>

同樣,您的While循環會使此動作與異步行為發生異常。 像這樣的東西怎么樣:

public static IObservable<System.IO.Stream> GetToplevelStreams(IObservable<byte> byteStream)
{
    return Observable.Create((IObserver<System.IO.Stream> o) =>
    {
        int? size1=null;
        int? size=null;
        var buf = new MemoryStream();
        var subscription = byteStream.Subscribe(v =>
        {
            if (!size1.HasValue)
            {
                size1 = ((int)v) << 8;
            }
            else if (!size.HasValue)
            {
                size = size1.Value + v;
            }
            else
            {
                buf.WriteByte(v);
            }
            if (size.HasValue && buf.Length == size)
            {
                buf.Position = 0;
                o.OnNext(buf);
                buf.SetLength(0);
                size1 = null;
                size = null;
            }

        }, (ex)=>o.OnError(ex), ()=>o.OnCompleted());
        return () => subscription.Dispose();
    });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM