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.