public IDisposable Activate()
{
if (Interlocked.Increment(ref refCount) == 1) {
var disp = new CompositeDisposable(blocks.SelectMany(x => x()));
Interlocked.Exchange(ref activationHandle, disp).Dispose();
activated.OnNext(Unit.Default);
}
return Disposable.Create(() => Deactivate());
}