You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Version 4.1.0 is an enhancement version over 4.0.0 by keeping the public API and extending it additively as well as having significant internal changes for better performance via less allocation, less indirection and less locking on the existing components. Note that the codebase now always uses the latest C# language features.
Pull 556: Use the helper methods for IDisposable-fields, avoid repeating code patterns.
Pull 551: Rework SkipUntil with lock-free methods.
Pull 546: Reimplement Timeout(TimeSpan) with lock-free methods.
Pull 566: BasicProducer/Producer: Save the allocation of a closure and allow delegate caching in case scheduling on CurrentThreadScheduler is required.
Pull 589: Add missing state XML comment to the new AsyncLock methods.
Other notable (internal) changes
Pull 527: Refactor Linq operator unit tests into separate files/classes.
Pull 523: Fix CombineLatest and Zip code generator templates. (#)
Pull 515: Reference System.ValueTuple for further reduction of allocations, use C# 7.1 to use value tuples without the need for explicit tuple component naming.
Pull 554: Enhance AsyncLock to support passing state.
Pull 493: Strengthen the concept of the Sink class.
Pull 482: Add public API approval tests for Rx.NET.
Pull 548: Avoid repeating code patterns in the System.Reactive.Disposables-namespace.
Pull 518: Add a new extension method for IScheduler that allows to schedule an Action<TState> and pass a corresponding state object.
Pull 555: Resolve the source of confusion that is DefaultDisposable.
Pull 564: Rename and reorder the signature of the extension for schedule that takes an Action<TState> and a state.
Pull 537: Update the HomoIcon tool to reflect new repository structure and manual code changes.
NuGet: 4.1.0
>PM Install-Package System.Reactive -Version 4.1.0
Version 4.1.0 is an enhancement version over 4.0.0 by keeping the public API and extending it additively as well as having significant internal changes for better performance via less allocation, less indirection and less locking on the existing components. Note that the codebase now always uses the latest C# language features.
API enhancements
RetryWhen
operator.IConnectableObservable.AutoConnect()
operator.RepeatWhen
operator.RefCount
overload supporting a grace period before disconnecting.Append
andPrepend
operators.TakeUntil(Func<T, bool>)
operator.Performance enhancements
AsyncLock
.CompositeDisposable
.Concat(IObservable<IObservable<T>>)
.TailRecursiveSink
lock-free and have less allocations.AutoDetachObserver
memory footprint.ObserveOn(IScheduler)
internals with a lock-free algorithm.AsyncSubject
by using lock-free methods.Subject
observer tracking.Amb
with lock-free algorithm.Never<TResult>
singleton.Empty<T>()
a singleton.Amb
implementation for arrays and enumerables.TakeUntil
with lock-free methods.System.Reactive.Concurrency
namespace.IDisposable
-fields, avoid repeating code patterns.SkipUntil
with lock-free methods.Timeout(TimeSpan)
with lock-free methods.BasicProducer
/Producer
: Save the allocation of a closure and allow delegate caching in case scheduling onCurrentThreadScheduler
is required.Schedule
calls with state.Disposable
helper methods were applicable.RefCountDisposable
lock-free.Producer
such that allSink
s set the upstream disposable by themselves.ScheduledItem
.StableCompositeDisposable.Create
into theSink
s.Disposable.Create
.AsyncLock
in some places to save allocation of closures and allow delegate caching.AnonymousObserver
use at places.First
&Last
operators.SerialDisposable
usages.Append
andPrepend
.BasicProducer.SubscribeRaw
can be saved in most cases.SelectMany
.Timeout(Absolute|Selector)
use lock-free methods.TakeUntil(time)
use lock-free methods.Scheduler.Recursive
more uniform and allocate less.Switch
.ThreadPoolScheduler.PeriodicTimer
.Zip
.CombineLatest
.Throttle
, save some allocations.Merge
, save some allocations.SelectMany
.SingleAssignmentDisposables
inJoin
.SubscribeOnCtxObservable
.ToTaskObserver
.ToObservable
.JoinObserver
.GroupJoin
.UserWorkItem
inThreadPoolScheduler.Windows
and save some allocations.AnonymousDisposable
where appropriate.Window
operator.Buffer
operator.Delay
operator.GroupByUntil
operator.SingleAssignmentDisposable
inGetEnumerator
.Generate
.Window
s code that schedules async work.Buffer
via dedicated exact/skip implementations.Generate()
internals.PushPullAdapter
+Sink
dispose management.Range()
.Repeat()
.TakeLast()
.Timer()
scheduler handling.ToObservable()
.ScheduleAsync
.QueryLanguage.Creation
.TaskObservableExtensions
.Return
/Throw
/Append
/Prepend
overhead withImmediateScheduler
.StableCompositeDisposable.Create
overhead via dedicated implementation.Append
/Prepend
some more optimizations.StableCompositeDisposable.Create
for two disposables.CancellationDisposable
inSelectMany
.RefCount()
internals.ContinueWith
.SingleAssignmentDisposable
inCombineLatest
.Array.Empty<T>()
to save allocation of an empty array where appropriate.PriorityQueue
List<E>
with.Skip(0)
SingleAssignmentDisposable
inLocalScheduler.WorkItem
.Bugfixes
DefaultScheduler
.PeriodicTimerSystemClockMonitor
concurrency & failure behavior.Delay
hanging due to wrong disposable-chain management.EventLoopScheduler
set _nextItem tonull
onTick
to avoid leaks.ActivePlan
crashing with self-joins.ControlScheduler
do more eager disposed checks.PriorityQueue
to not share a item ordering helper index.ElementAt
don't create exception after finding the item.FirstAsync
don't create exception after finding the item.ToArray()
avoid retention of the list beyond the conversion.ToDictionary()
to clear the dictionary reference upon termination.ToList()
release reference to the list upon termination.ToLookup()
release lookup upon failure/termination.Latest
.TaskObservableExtensions.Subscribe
.Documentation changes
README.md
.AsyncLock
methods.Other notable (internal) changes
CombineLatest
andZip
code generator templates. (#)System.ValueTuple
for further reduction of allocations, use C# 7.1 to use value tuples without the need for explicit tuple component naming.AsyncLock
to support passing state.Sink
class.System.Reactive.Disposables
-namespace.IScheduler
that allows to schedule anAction<TState>
and pass a corresponding state object.DefaultDisposable
.Action<TState>
and a state.ExceptionHelper
&HalfSerializer
lock-free tools.HalfSerializer
extensions.LastIndexOf
instead ofIndexOf
inLicenseHeaderTest
.IdentitySink
inSkipUntil
.Switch
, use the features ofSink
.TakeLast
.UserWorkItem
class currently nested inDefaultScheduler
.AnonymousDisposable
that can be given a state object. Add a genericDisposable.Create
method.IdentitySink.Run
where appropriate.Delay
into a base class.Count()
don't init to default zero.DistinctUntilChanged()
don't init to default.ForEach()
don't init to default values.LongCount()
don't init to default zero.Max()
don't init to default value.MaxBy
cleanup/initialization.Min()
don't initialize to default values.MinBy()
cleanup/initialization.OfType()
use pattern variable instead of double cast.RefCount()
don't init to the default values.Scan()
don't init to default values.Select()
don't init to default value.SequenceEqual()
initialization cleanup.SingleAsync()
don't init to default values.SingleOrDefaultAsync()
don't init to default.SkipUntil()
remove unused helper class.SkipWhile()
don't init to default value.Sum()
don't init to default values.TakeLastBuffer()
usebase.Run
, explicit args.TakeWhile()
don't init to default value.Where()
don't init to default value.Window()
don't init to default value.Zip()
no need to keep reference to the parent beyondRun
.IScheduler
allowing to return anIDisposable
.default(X)
usages.AppendPrepend
disposing the main source onILongRunningScheduler
s.System.Reactive
fix field names, type args, usings, operator infrastructure.\obj\
directories.ObserveOn
StackOverflowException
uponDispose()
.ObserveOn
operator toIdentitySink
, fix queue usage.Sink.Dispose
should only callDispose(true)
once.The text was updated successfully, but these errors were encountered: