Skip to content

Commit 3a58436

Browse files
authored
Use stateful AnonymousDisposable where appropriate. (#651)
1 parent 316efb9 commit 3a58436

File tree

2 files changed

+39
-29
lines changed

2 files changed

+39
-29
lines changed

Rx.NET/Source/src/System.Reactive/Linq/Observable/FromEvent.cs

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -276,19 +276,23 @@ public IDisposable Connect(IObserver<TArgs> observer)
276276
}
277277
}
278278

279-
return Disposable.Create(() =>
280-
{
281-
connection.Dispose();
282-
283-
lock (_parent._gate)
279+
return Disposable.Create(
280+
(this, _parent, connection),
281+
tuple =>
284282
{
285-
if (--_count == 0)
283+
var (@this, closureParent, closureConnection) = tuple;
284+
285+
closureConnection.Dispose();
286+
287+
lock (closureParent._gate)
286288
{
287-
_parent._scheduler.ScheduleAction(_removeHandler, handler => handler.Dispose());
288-
_parent._session = null;
289+
if (--@this._count == 0)
290+
{
291+
closureParent._scheduler.ScheduleAction(@this._removeHandler, handler => handler.Dispose());
292+
closureParent._session = null;
293+
}
289294
}
290-
}
291-
});
295+
});
292296
}
293297

294298
}
@@ -362,7 +366,9 @@ public ClassicEventProducer(Action<TDelegate> addHandler, Action<TDelegate> remo
362366
protected override IDisposable AddHandler(TDelegate handler)
363367
{
364368
_addHandler(handler);
365-
return Disposable.Create(() => _removeHandler(handler));
369+
return Disposable.Create(
370+
(_removeHandler, handler),
371+
tuple => tuple._removeHandler(tuple.handler));
366372
}
367373
}
368374
}

Rx.NET/Source/src/System.Reactive/Linq/Observable/RefCount.cs

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -130,32 +130,36 @@ public void Run(Lazy parent)
130130
}
131131
}
132132

133-
SetUpstream(Disposable.Create(() =>
134-
{
135-
subscription.Dispose();
136-
137-
lock (parent._gate)
133+
SetUpstream(Disposable.Create(
134+
(parent, subscription),
135+
tuple =>
138136
{
139-
if (--parent._count == 0)
140-
{
141-
var cancelable = (SingleAssignmentDisposable)Volatile.Read(ref parent._serial);
137+
var (closureParent, closureSubscription) = tuple;
138+
139+
closureSubscription.Dispose();
142140

143-
cancelable.Disposable = parent._scheduler.Schedule(cancelable, parent._disconnectTime, (self, state) =>
141+
lock (closureParent._gate)
142+
{
143+
if (--closureParent._count == 0)
144144
{
145-
lock (parent._gate)
145+
var cancelable = (SingleAssignmentDisposable)Volatile.Read(ref closureParent._serial);
146+
147+
cancelable.Disposable = closureParent._scheduler.Schedule((cancelable, closureParent), closureParent._disconnectTime, (self, tuple2) =>
146148
{
147-
if (object.ReferenceEquals(Volatile.Read(ref parent._serial), state))
149+
lock (tuple2.closureParent._gate)
148150
{
149-
parent._connectableSubscription.Dispose();
150-
parent._connectableSubscription = null;
151+
if (object.ReferenceEquals(Volatile.Read(ref tuple2.closureParent._serial), tuple2.cancelable))
152+
{
153+
tuple2.closureParent._connectableSubscription.Dispose();
154+
tuple2.closureParent._connectableSubscription = null;
155+
}
151156
}
152-
}
153157

154-
return Disposable.Empty;
155-
});
158+
return Disposable.Empty;
159+
});
160+
}
156161
}
157-
}
158-
}));
162+
}));
159163
}
160164
}
161165
}

0 commit comments

Comments
 (0)