我想将util._
解组为消息。每个发射可能包含零个或多个消息,或与先前的发射合并以形成零个或多个消息。所以我正在使用IObservable<Memory<bytes>>
(伪代码):
SelectMany
我很好奇这在堆分配和线程安全方面如何工作。如果我理解正确,如果IObservable<Message> messages = bytes.SelectMany(mem => {
// copy into another buffer
if(somethingWrong)
{
return Observable.Throw<Message>(new Exception("..."));
}
else if(gotCompleteMessage)
{
// QUESTION IS PRIMARILY ABOUT THIS
// create message(s)
// clear/compact buffer
// return new Observable of message(s)
}
else
{
return Observable.Empty<Message>();
}
});
是在没有messages
的情况下订阅的,这将在观察者上同步调用ObserveOn
,并且所有内容都将存在于堆栈中。而且,如果使用OnNext
,则消息本身(而不是ObserveOn
返回的Observable
)将驻留在堆上,并且需要是线程安全的。是吗?