Change:
run you'll notice that in the main process before creating the renderer the update service takes its time (~5-10ms). while that's not much it seems unnecessary and "block" the renderer for no good reason <img width="1101" alt="Screenshot 2020-01-31 at 14 45 07" src="https://user-"
This is only problematic in macOS where calls into the native which blocks.
Thanks

Discussion:
const windows = appInstantiationService.invokeFunction(accessor => this.openFirstWindow(accessor, electronIpcServer, sharedProcessClient)); // Post Open Windows Tasks <del> this.afterWindowOpen(); </del> <ins> appInstantiationService.invokeFunction(this.afterWindowOpen.bind(this)); </ins> // Tracing: Stop tracing after windows are ready if enabled if (this.environmentService.args.trace) {

return { fileUri: URI.file(path) }; } <del> private afterWindowOpen(): void { </del> <ins> private afterWindowOpen(accessor: ServicesAccessor): void { </ins> // Signal phase: after window open this.lifecycleMainService.phase = LifecycleMainPhase.AfterWindowOpen; // Remote Authorities this.handleRemoteAuthorities(); <ins> // Initialize update service const updateService = accessor.get(IUpdateService); if (updateService instanceof Win32UpdateService || updateService instanceof LinuxUpdateService || updateService instanceof DarwinUpdateService) { updateService.initialize(); } </ins> } private handleRemoteAuthorities(): void {

_serviceBrand: undefined; <del> protected readonly url: string | undefined; </del> <ins> protected url: string | undefined; </ins> private _state: State = State.Uninitialized;

@IEnvironmentService private readonly environmentService: IEnvironmentService, @IRequestService protected requestService: IRequestService, @ILogService protected logService: ILogService, <del> ) { </del> <ins> ) { } /** * This must be called before any other call. This is a performance * optimization, to avoid using extra CPU cycles before first window open. * https://github.com/microsoft/vscode/issues/89784 */ initialize(): void { </ins> if (!this.environmentService.isBuilt) { return; // updates are never enabled when running out of sources }

if (!this.url) { return Promise.resolve(undefined); } return this.requestService.request({ url: this.url }, CancellationToken.None).then(context => { // The update server replies with 204 (No Content) when no // update is available - that's all we want to know.

@ILogService logService: ILogService ) { super(lifecycleMainService, configurationService, environmentService, requestService, logService); <ins> } initialize(): void { super.initialize(); </ins> this.onRawError(this.onError, this, this.disposables); this.onRawUpdateAvailable(this.onUpdateAvailable, this, this.disposables); this.onRawUpdateDownloaded(this.onUpdateDownloaded, this, this.disposables);

@IFileService private readonly fileService: IFileService ) { super(lifecycleMainService, configurationService, environmentService, requestService, logService); <ins> } initialize(): void { super.initialize(); </ins> if (getUpdateType() === UpdateType.Setup) { /* __GDPR__

"target" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" } } */ <del> telemetryService.publicLog('update:win32SetupTarget', { target: product.target }); </del> <ins> this.telemetryService.publicLog('update:win32SetupTarget', { target: product.target }); </ins> } }