我正在使用反应库我观察字节,当我得到它们时我发布它们。我无法找到我应该等待收集所有字节的位置。然后处理它们。
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.
}
答案 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