void () { if (future.isCancelled()) return; Disposer.dispose(listenerDisposable); // remove listener early to prevent firing it during continuation execution try { if (!progressIndicator.isCanceled()) { continuation.getAction().run(); } } finally { future.complete(null); } }