等到我收到完整的消息后,我正在使用反应库来获取数据

时间:2013-08-26 21:01:19

标签: c# string multithreading bytearray system.reactive

我正在使用反应库我观察字节,当我得到它们时我发布它们。我无法找到我应该等待收集所有字节的位置。然后处理它们。

 public partial class Form1 : Form
        { 
     public Form1()
            {
                InitializeComponent();
                obj.SignatureAvailable.ObserveOn(SynchronizationContext.Current).Subscribe(HandlePinsAvailable);
            }

            void HandlePinsAvailable(byte[] signBytes)
            {
//here I will collect byte blocks.

                //MessageBox.Show(Encoding.ASCII.GetString(signBytes));
            }
    }

      public class SignatureListener
        {
             private Subject<byte[]> SignaturesAvailable = new Subject<byte[]>();

             public IObservable<byte[]> SignatureAvailable { get { return SignaturesAvailable.AsObservable(); } }

            private IDisposable SignatureSubscription;

            public SignatureListener()
            {
                SignatureSubscription = HidUtility.Messages.Subscribe(HandlePinMessageBytes);
            }
      public void HandlePinMessageBytes(byte[] signatureBytes)
            { 
    SignaturesAvailable.OnNext(sobj.RawData.ToArray());
    }
    public class data
    {
    public void get data()
    {
         private static Subject<byte[]> subject = new Subject<byte[]>();
      public static IObservable<byte[]> Messages { get { return subject.AsObservable(); } }
      subject.OnNext(bytes);//I have have the actuall blocks here.
        }

1 个答案:

答案 0 :(得分:0)

我不完全理解你的问题,如果我的回答不合适,请道歉。

我认为你所拥有的是你正在观察的Bytes流。这个蒸汽将“块”字节给你,直到你到达流的末尾(如FileStream)。

如果是这种情况,那么您可以继续处理字节,直到可观察序列完成。

var allBytes = new List<byte>();
org.SignatureAvailable.Subscribe(
    chunk=>{allBytes.AddRange(chunk);},       //OnNext
    ()=>{/*Do something with allBytes list*/} //OnCompleted
    );

这个问题是我们将这个列表泄露到异步序列的一边。更好的选择可能是使用Aggregate函数

org.SignatureAvailable
   .Aggregate(new List<byte>(), (acc, chunk)=>acc.AddRange(chunk))

现在,List<bytes>序列SignatureAvailable将为您提供单OnCompletes个字符,以便包含所有字节。为了保持格式一致,您可能希望返回字节。我认为你的解决方案看起来如下:

org.SignatureAvailable
   .Aggregate(new List<byte>(), (acc, chunk)=>acc.AddRange(chunk))
   .Select(list=>list.ToArray())
   .ObserveOn(SynchronizationContext.Current)
   .Subscribe(HandlePinsAvailable);          //Will only get called once when the sequence completes will all bytes.

本书中的这些链接可能有所帮助:

迭代文件:

http://introtorx.com/Content/v1.0.10621.0/15_SchedulingAndThreading.html#CreatingYourOwnIterator

聚合:

http://introtorx.com/Content/v1.0.10621.0/07_Aggregation.html#BuildYourOwn