protected override void Initialize() { // Create our broadcast block for subscribers to get new ILaunchProfiles Information _broadcastBlock = DataflowBlockSlim.CreateBroadcastBlock <ILaunchSettings>(); _changedSourceBlock = _broadcastBlock.SafePublicize(); // Subscribe to changes to the broadcast block using the idle scheduler. This should filter out a lot of the intermediates // states that files can be in. if (_projectSubscriptionService != null) { // The use of AsyncLazy with dataflow can allow state stored in the execution context to leak through. The downstream affect is // calls to say, get properties, may fail. To avoid this, we capture the execution context here, and it will be reapplied when // we get new subscription data from the dataflow. ITargetBlock <IProjectVersionedValue <Tuple <IProjectSubscriptionUpdate, IProjectCapabilitiesSnapshot> > > projectChangesBlock = DataflowBlockSlim.CreateActionBlock( DataflowUtilities.CaptureAndApplyExecutionContext <IProjectVersionedValue <Tuple <IProjectSubscriptionUpdate, IProjectCapabilitiesSnapshot> > >(ProjectRuleBlock_ChangedAsync)); StandardRuleDataflowLinkOptions evaluationLinkOptions = DataflowOption.WithRuleNames(ProjectDebugger.SchemaName); _projectRuleSubscriptionLink = ProjectDataSources.SyncLinkTo( _projectSubscriptionService.ProjectRuleSource.SourceBlock.SyncLinkOptions(evaluationLinkOptions), _commonProjectServices.Project.Capabilities.SourceBlock.SyncLinkOptions(), projectChangesBlock, linkOptions: DataflowOption.PropagateCompletion); } // Make sure we are watching the file at this point WatchLaunchSettingsFile(); }
protected override void Dispose(bool disposing) { if (disposing) { CleanupFileWatcher(); if (FileChangeScheduler != null) { FileChangeScheduler.Dispose(); FileChangeScheduler = null; } if (_sequentialTaskQueue != null) { _sequentialTaskQueue.Dispose(); _sequentialTaskQueue = null; } if (_broadcastBlock != null) { _broadcastBlock.Complete(); _broadcastBlock = null; } if (_projectRuleSubscriptionLink != null) { _projectRuleSubscriptionLink.Dispose(); _projectRuleSubscriptionLink = null; } } }
protected override void Initialize() { base.Initialize(); // Create an action block to process the design time inputs and configuration general changes ITargetBlock <IProjectVersionedValue <ValueTuple <DesignTimeInputs, IProjectSubscriptionUpdate> > > inputsAction = DataflowBlockSlim.CreateActionBlock <IProjectVersionedValue <ValueTuple <DesignTimeInputs, IProjectSubscriptionUpdate> > >(ProcessDataflowChanges); _broadcastBlock = DataflowBlockSlim.CreateBroadcastBlock <IProjectVersionedValue <DesignTimeInputsDelta> >(nameFormat: nameof(DesignTimeInputsChangeTracker) + "Broadcast {1}"); _publicBlock = AllowSourceBlockCompletion ? _broadcastBlock : _broadcastBlock.SafePublicize(); Assumes.Present(_project.Services.ProjectAsynchronousTasks); IDisposable projectLink = ProjectDataSources.SyncLinkTo( _inputsDataSource.SourceBlock.SyncLinkOptions( linkOptions: DataflowOption.PropagateCompletion), _projectSubscriptionService.ProjectRuleSource.SourceBlock.SyncLinkOptions( linkOptions: DataflowOption.WithRuleNames(ConfigurationGeneral.SchemaName)), inputsAction, DataflowOption.PropagateCompletion, cancellationToken: _project.Services.ProjectAsynchronousTasks.UnloadCancellationToken); // Create an action block to process file change notifications ITargetBlock <IProjectVersionedValue <string[]> > fileWatcherAction = DataflowBlockSlim.CreateActionBlock <IProjectVersionedValue <string[]> >(ProcessFileChangeNotification); IDisposable watcherLink = _fileWatcher.SourceBlock.LinkTo(fileWatcherAction, DataflowOption.PropagateCompletion); _disposables.Add(projectLink); _disposables.Add(watcherLink); JoinUpstreamDataSources(_inputsDataSource, _projectSubscriptionService.ProjectRuleSource, _fileWatcher); }
protected override async Task InitializeCoreAsync(CancellationToken cancellationToken) { await base.InitializeCoreAsync(cancellationToken); _broadcastBlock = DataflowBlockSlim.CreateBroadcastBlock <IProjectVersionedValue <RestoreData> >(); _publicBlock = _broadcastBlock.SafePublicize(); }
protected override void Initialize() { IPropagatorBlock <IProjectVersionedValue <ILaunchSettings>, IProjectVersionedValue <IReadOnlyList <IEnumValue> > > debugProfilesBlock = DataflowBlockSlim.CreateTransformBlock <IProjectVersionedValue <ILaunchSettings>, IProjectVersionedValue <IReadOnlyList <IEnumValue> > >( update => { // Compute the new enum values from the profile provider var generatedResult = DebugProfileEnumValuesGenerator.GetEnumeratorEnumValues(update.Value).ToImmutableList(); _dataSourceVersion++; ImmutableDictionary <NamedIdentity, IComparable> dataSources = ImmutableDictionary <NamedIdentity, IComparable> .Empty.Add(DataSourceKey, DataSourceVersion); return(new ProjectVersionedValue <IReadOnlyList <IEnumValue> >(generatedResult, dataSources)); }); IBroadcastBlock <IProjectVersionedValue <IReadOnlyList <IEnumValue> > > broadcastBlock = DataflowBlockSlim.CreateBroadcastBlock <IProjectVersionedValue <IReadOnlyList <IEnumValue> > >(); // The interface has two definitions of SourceBlock: one from // ILaunchSettingsProvider, and one from IProjectValueDataSource<T> (via // IVersionedLaunchSettingsProvider). We need the cast to pick the proper one. _launchProfileProviderLink = ((IProjectValueDataSource <ILaunchSettings>)LaunchSettingProvider).SourceBlock.LinkTo( debugProfilesBlock, linkOptions: DataflowOption.PropagateCompletion); JoinUpstreamDataSources(LaunchSettingProvider); _debugProviderLink = debugProfilesBlock.LinkTo(broadcastBlock, DataflowOption.PropagateCompletion); _publicBlock = broadcastBlock.SafePublicize(); }
protected override void Initialize() { base.Initialize(); _broadcastBlock = DataflowBlockSlim.CreateBroadcastBlock <IProjectVersionedValue <string[]> >(nameFormat: nameof(DesignTimeInputsFileWatcher) + "Broadcast {1}"); _publicBlock = AllowSourceBlockCompletion ? _broadcastBlock : _broadcastBlock.SafePublicize(); _actionBlock = DataflowBlockFactory.CreateActionBlock <IProjectVersionedValue <DesignTimeInputs> >(ProcessDesignTimeInputs, _project); _dataSourceLink = _designTimeInputsDataSource.SourceBlock.LinkTo(_actionBlock, DataflowOption.PropagateCompletion); JoinUpstreamDataSources(_designTimeInputsDataSource); }
public SnapshotUpdater(IProjectThreadingService projectThreadingService, CancellationToken unloadCancellationToken) { // Initial snapshot is empty. _currentSnapshot = DependenciesSnapshot.Empty; // Updates will be published via Dataflow. _source = DataflowBlockSlim.CreateBroadcastBlock <SnapshotChangedEventArgs>("DependenciesSnapshot {1}", skipIntermediateInputData: true); // Updates are debounced to conflate rapid updates and reduce frequency of tree updates downstream. _debounce = new TaskDelayScheduler( TimeSpan.FromMilliseconds(250), projectThreadingService, unloadCancellationToken); }
protected override void Initialize() { base.Initialize(); IDisposable projectRuleSourceLink = _project.Services.ProjectSubscription.ProjectRuleSource.SourceBlock.LinkToAsyncAction(ProcessProjectChanged, ruleNames: PotentialEditorConfigFiles.SchemaName); IDisposable join = JoinUpstreamDataSources(_project.Services.ProjectSubscription.ProjectRuleSource); _disposables = new DisposableBag(); _disposables.AddDisposable(projectRuleSourceLink); _disposables.AddDisposable(join); _broadcastBlock = DataflowBlockSlim.CreateBroadcastBlock <IProjectVersionedValue <FileWatchData> >(nameFormat: nameof(PotentialEditorConfigDataSource) + "Broadcast {1}"); _publicBlock = _broadcastBlock.SafePublicize(); }
public DependenciesSnapshotProvider( IUnconfiguredProjectCommonServices commonServices, Lazy <IAggregateCrossTargetProjectContextProvider> contextProvider, IUnconfiguredProjectTasksService tasksService, IActiveConfiguredProjectSubscriptionService activeConfiguredProjectSubscriptionService, IActiveProjectConfigurationRefreshService activeProjectConfigurationRefreshService, ITargetFrameworkProvider targetFrameworkProvider, IAggregateDependenciesSnapshotProvider aggregateSnapshotProvider) : base(commonServices.ThreadingService.JoinableTaskContext) { Requires.NotNull(contextProvider, nameof(contextProvider)); Requires.NotNull(tasksService, nameof(tasksService)); Requires.NotNull(activeConfiguredProjectSubscriptionService, nameof(activeConfiguredProjectSubscriptionService)); Requires.NotNull(activeProjectConfigurationRefreshService, nameof(activeProjectConfigurationRefreshService)); Requires.NotNull(targetFrameworkProvider, nameof(targetFrameworkProvider)); Requires.NotNull(aggregateSnapshotProvider, nameof(aggregateSnapshotProvider)); _commonServices = commonServices; _contextProvider = contextProvider; _tasksService = tasksService; _activeConfiguredProjectSubscriptionService = activeConfiguredProjectSubscriptionService; _activeProjectConfigurationRefreshService = activeProjectConfigurationRefreshService; _targetFrameworkProvider = targetFrameworkProvider; _currentSnapshot = DependenciesSnapshot.CreateEmpty(_commonServices.Project.FullPath); _dependencySubscribers = new OrderPrecedenceImportCollection <IDependencyCrossTargetSubscriber>( projectCapabilityCheckProvider: commonServices.Project); _snapshotFilters = new OrderPrecedenceImportCollection <IDependenciesSnapshotFilter>( ImportOrderPrecedenceComparer.PreferenceOrder.PreferredComesLast, projectCapabilityCheckProvider: commonServices.Project); _subTreeProviders = new OrderPrecedenceImportCollection <IProjectDependenciesSubTreeProvider>( ImportOrderPrecedenceComparer.PreferenceOrder.PreferredComesLast, projectCapabilityCheckProvider: commonServices.Project); _dependenciesUpdateScheduler = new TaskDelayScheduler( _dependenciesUpdateThrottleInterval, commonServices.ThreadingService, tasksService.UnloadCancellationToken); _snapshotChangedSource = DataflowBlockSlim.CreateBroadcastBlock <SnapshotChangedEventArgs>("DependenciesSnapshot {1}", skipIntermediateInputData: true); aggregateSnapshotProvider.RegisterSnapshotProvider(this); }
public PackageRestoreServiceInstance( UnconfiguredProject project, IPackageRestoreUnconfiguredInputDataSource dataSource, IProjectThreadingService threadingService, IProjectAsynchronousTasksService projectAsynchronousTasksService, IVsSolutionRestoreService3 solutionRestoreService, IFileSystem fileSystem, IProjectLogger logger, IBroadcastBlock <IProjectVersionedValue <RestoreData> > broadcastBlock) : base(threadingService.JoinableTaskContext) { _project = project; _dataSource = dataSource; _projectAsynchronousTasksService = projectAsynchronousTasksService; _solutionRestoreService = solutionRestoreService; _fileSystem = fileSystem; _logger = logger; _broadcastBlock = broadcastBlock; }
protected override void Initialize() { IPropagatorBlock <ILaunchSettings, IProjectVersionedValue <IReadOnlyList <IEnumValue> > > debugProfilesBlock = DataflowBlockSlim.CreateTransformBlock <ILaunchSettings, IProjectVersionedValue <IReadOnlyList <IEnumValue> > >( update => { // Compute the new enum values from the profile provider var generatedResult = DebugProfileEnumValuesGenerator.GetEnumeratorEnumValues(update).ToImmutableList(); _dataSourceVersion++; ImmutableDictionary <NamedIdentity, IComparable> dataSources = ImmutableDictionary <NamedIdentity, IComparable> .Empty.Add(DataSourceKey, DataSourceVersion); return(new ProjectVersionedValue <IReadOnlyList <IEnumValue> >(generatedResult, dataSources)); }); IBroadcastBlock <IProjectVersionedValue <IReadOnlyList <IEnumValue> > > broadcastBlock = DataflowBlockSlim.CreateBroadcastBlock <IProjectVersionedValue <IReadOnlyList <IEnumValue> > >(); _launchProfileProviderLink = LaunchSettingProvider.SourceBlock.LinkTo( debugProfilesBlock, linkOptions: DataflowOption.PropagateCompletion); _debugProviderLink = debugProfilesBlock.LinkTo(broadcastBlock, DataflowOption.PropagateCompletion); _publicBlock = broadcastBlock.SafePublicize(); }
protected override void Initialize() { base.Initialize(); _broadcastBlock = DataflowBlockSlim.CreateBroadcastBlock <IProjectVersionedValue <T> >(options: null); }
protected override void Initialize() { base.Initialize(); _broadcastBlock = DataflowBlockSlim.CreateBroadcastBlock <IProjectVersionedValue <T> >(null !); // TODO-NULLABLE remove ! once CPS annotation updated }