C# 等待,直到我得到完整的消息,我正在使用反应库获取数据

C# 等待,直到我得到完整的消息,我正在使用反应库获取数据,c#,string,multithreading,bytearray,system.reactive,C#,String,Multithreading,Bytearray,System.reactive,我使用的是反应式库,我观察字节,当我得到它们时,我发布它们。我无法找到我应该在哪里等待收集所有字节。然后处理它们 public partial class Form1 : Form { public Form1() { InitializeComponent(); obj.SignatureAvailable.ObserveOn(SynchronizationContext.Cu

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

 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:表单
{ 
公共表格1()
{
初始化组件();
obj.SignatureAvailable.ObserveOn(SynchronizationContext.Current).Subscribe(HandlePinsAvailable);
}
无效HandlePinsAvailable(字节[]符号字节)
{
//这里我将收集字节块。
//Show(Encoding.ASCII.GetString(signBytes));
}
}
公共类签名侦听器
{
私有主题签名可用=新主题();
public IObservable SignatureAvailable{get{return SignaturesAvailable.AsObservable();}}
私有IDisposable签名订阅;
公共签名主持人()
{
SignatureSubscription=HidUtility.Messages.Subscribe(HandlePinMessageBytes);
}
public void HandlePinMessageBytes(byte[]signatureBytes)
{ 
SignaturesAvailable.OnNext(sobj.RawData.ToArray());
}
公共类数据
{
公共void获取数据()
{
私有静态主题=新主题();
公共静态IObservable消息{get{return subject.asobbservable();}}
subject.OnNext(字节);//这里有实际的块。
}

我不完全理解您的问题,如果我的回答不恰当,请道歉

我假设您所拥有的是一个您正在观察的字节流。这个数据流将向您“分块”字节,直到您到达流的末尾(如
FileStream

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

var allBytes = new List<byte>();
org.SignatureAvailable.Subscribe(
    chunk=>{allBytes.AddRange(chunk);},       //OnNext
    ()=>{/*Do something with allBytes list*/} //OnCompleted
    );
一旦签名可用序列完成后,现在将返回一个包含所有字节的
列表。要保持格式一致,您可能需要返回字节。我认为您的解决方案如下所示:

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.
org.SignatureAvailable
.Aggregate(新列表(),(acc,chunk)=>acc.AddRange(chunk))
.Select(list=>list.ToArray())
.ObserveOn(SynchronizationContext.Current)
.Subscribe(handlepinsavable);//将在序列完成时只调用一次,所有字节都将被调用。
我书中的这些链接可能会有所帮助:

迭代文件:

聚合:

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.