/// <summary> /// This event could be raised from multiple threads. Only perform thread-safe operations /// </summary> private void PackageRestoreManager_PackageRestored(object sender, PackageRestoredEventArgs args) { if (Token.IsCancellationRequested) { _canceled = true; return; } if (args.Restored) { var packageIdentity = args.Package; Interlocked.Increment(ref CurrentCount); ThreadHelper.JoinableTaskFactory.RunAsync(async delegate { await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(); var progressData = new ThreadedWaitDialogProgressData(string.Format(CultureInfo.CurrentCulture, Resources.RestoredPackage, packageIdentity), string.Empty, string.Empty, isCancelable: true, currentStep: CurrentCount, totalSteps: TotalCount); ThreadedWaitDialogProgress.Report(progressData); }); } }
/// <summary> /// This event could be raised from multiple threads. Only perform thread-safe operations /// </summary> private void PackageRestoreManager_PackageRestored(object sender, PackageRestoredEventArgs args) { PackageIdentity packageIdentity = args.Package; if (args.Restored && CancellationTokenSource != null && !CancellationTokenSource.IsCancellationRequested) { bool canceled = false; Interlocked.Increment(ref CurrentCount); // The rate at which the packages are restored is much higher than the rate at which a wait dialog can be updated // And, this event is raised by multiple threads // So, only try to update the wait dialog if an update is not already in progress. Use the int 'WaitDialogUpdateGate' for this purpose // Always, set it to 1 below and gets its old value. If the old value is 0, go and update, otherwise, bail if (Interlocked.Equals(Interlocked.Exchange(ref WaitDialogUpdateGate, 1), 0)) { _waitDialog.UpdateProgress( String.Format(CultureInfo.CurrentCulture, Resources.RestoredPackage, packageIdentity.ToString()), String.Empty, szStatusBarText: null, iCurrentStep: CurrentCount, iTotalSteps: TotalCount, fDisableCancel: false, pfCanceled: out canceled); Interlocked.Exchange(ref WaitDialogUpdateGate, 0); } } }
public void Execute_SolutionHasOneProjectWithOneUnrestoredPackage_PackageRestoredEventFiredForPackage() { FakePackageManagementProject project = CreateSolutionWithOneProject(); project.AddPackageReference("MyPackage", "1.0"); FakePackage package = AddPackageToPriorityRepository("MyPackage", "1.0"); CreateAction(); CapturePackageRestoredEvents(); action.Execute(); PackageRestoredEventArgs eventArgs = packageRestoredEvents [0]; Assert.AreEqual(package, eventArgs.Package); }
// This event could be raised from multiple threads. Only perform thread-safe operations private void PackageRestoreManager_PackageRestored( object sender, PackageRestoredEventArgs args) { if (_status != NuGetOperationStatus.Cancelled && args.Restored) { var packageIdentity = args.Package; Interlocked.Increment(ref _currentCount); _logger.Do((_, progress) => { progress?.ReportProgress( string.Format( CultureInfo.CurrentCulture, Resources.RestoredPackage, packageIdentity), (uint)_currentCount, (uint)_missingPackagesCount); }); } }
public void Execute_ProjectHasOneUnrestoredPackage_PackageRestoredEventFiredForPackage() { FakePackageManagementProject project = CreateSolutionWithOneProject(); project.AddPackageReference("MyPackage", "1.0"); FakePackage package = AddPackageToPriorityRepository("MyPackage", "1.0"); CreateAction(); CapturePackageRestoredEvents(); var dotNetProject = new FakeDotNetProject(); dotNetProject.Name = "MyProject"; solution.FakeProjectsToReturnFromGetProject.Add("MyProject", project); action.Project = dotNetProject; action.Execute(); PackageRestoredEventArgs eventArgs = packageRestoredEvents [0]; Assert.AreEqual(package, eventArgs.Package); }
// This event could be raised from multiple threads. Only perform thread-safe operations private void PackageRestoreManager_PackageRestored( object sender, PackageRestoredEventArgs args) { if (_status != NuGetOperationStatus.Cancelled && args.Restored) { var packageIdentity = args.Package; Interlocked.Increment(ref _currentCount); NuGetUIThreadHelper.JoinableTaskFactory.Run(async() => { // capture current progress from the current execution context var progress = RestoreOperationProgressUI.Current; await progress?.ReportProgressAsync( string.Format( CultureInfo.CurrentCulture, Resources.RestoredPackage, packageIdentity), (uint)_currentCount, (uint)_missingPackagesCount); }); } }