Skip to content

Commit 4bacd05

Browse files
authored
Fix cancellation token usage to prevent ObjectDisposedException (#7088)
1 parent 0e6ee57 commit 4bacd05

10 files changed

Lines changed: 88 additions & 76 deletions

File tree

src/NuGet.Clients/NuGet.PackageManagement.UI/GlobalSuppressions.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
[assembly: SuppressMessage("Build", "CA1062:In externally visible method 'AccessiblePackageIdentity.AccessiblePackageIdentity(PackageIdentity id)', validate parameter 'id' is non-null before using it. If appropriate, throw an ArgumentNullException when the argument is null or add a Code Contract precondition asserting non-null argument.", Justification = "<Pending>", Scope = "member", Target = "~M:NuGet.PackageManagement.UI.AccessiblePackageIdentity.#ctor(NuGet.Packaging.Core.PackageIdentity)")]
2121
[assembly: SuppressMessage("Build", "CA1062:In externally visible method 'object AdditionConverter.Convert(object[] values, Type targetType, object parameter, CultureInfo culture)', validate parameter 'values' is non-null before using it. If appropriate, throw an ArgumentNullException when the argument is null or add a Code Contract precondition asserting non-null argument.", Justification = "<Pending>", Scope = "member", Target = "~M:NuGet.PackageManagement.UI.AdditionConverter.Convert(System.Object[],System.Type,System.Object,System.Globalization.CultureInfo)~System.Object")]
2222
[assembly: SuppressMessage("Build", "CA1822:Member ExplainPackageDeprecationReasons does not access instance data and can be marked as static (Shared in VisualBasic)", Justification = "<Pending>", Scope = "member", Target = "~M:NuGet.PackageManagement.UI.DetailControlModel.ExplainPackageDeprecationReasons(System.Collections.Generic.IReadOnlyCollection{System.String})~System.String")]
23-
[assembly: SuppressMessage("Build", "CA1062:In externally visible method 'Task DetailControlModel.SetCurrentPackageAsync(PackageItemViewModel searchResultPackage, ItemFilter filter, Func<PackageItemViewModel> getPackageItemViewModel)', validate parameter 'getPackageItemViewModel' is non-null before using it. If appropriate, throw an ArgumentNullException when the argument is null or add a Code Contract precondition asserting non-null argument.", Justification = "<Pending>", Scope = "member", Target = "~M:NuGet.PackageManagement.UI.DetailControlModel.SetCurrentPackageAsync(NuGet.PackageManagement.UI.PackageItemViewModel,NuGet.PackageManagement.UI.ItemFilter,System.Func{NuGet.PackageManagement.UI.PackageItemViewModel})~System.Threading.Tasks.Task")]
2423
[assembly: SuppressMessage("Build", "CA1062:In externally visible method 'DisplayVersion.DisplayVersion(VersionRange range, string additionalInfo, bool isValidVersion = true, bool isCurrentInstalled = false, bool autoReferenced = false, bool isDeprecated = false, string versionFormat = \"N\")', validate parameter 'range' is non-null before using it. If appropriate, throw an ArgumentNullException when the argument is null or add a Code Contract precondition asserting non-null argument.", Justification = "<Pending>", Scope = "member", Target = "~M:NuGet.PackageManagement.UI.DisplayVersion.#ctor(NuGet.Versioning.VersionRange,System.String,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.String)")]
2524
[assembly: SuppressMessage("Build", "CA1822:Member WaitForInitialResultsAsync does not access instance data and can be marked as static (Shared in VisualBasic)", Justification = "<Pending>", Scope = "member", Target = "~M:NuGet.PackageManagement.UI.InfiniteScrollList.WaitForInitialResultsAsync(NuGet.PackageManagement.UI.IItemLoader{NuGet.PackageManagement.UI.PackageItemViewModel},System.IProgress{NuGet.PackageManagement.UI.IItemLoaderState},System.Threading.CancellationToken)~System.Threading.Tasks.Task")]
2625
[assembly: SuppressMessage("Build", "CA1303:Method 'object NotEqualConverter.Convert(object value, Type targetType, object parameter, CultureInfo culture)' passes a literal string as parameter 'message' of a call to 'ArgumentException.ArgumentException(string message)'. Retrieve the following string(s) from a resource table instead: \"Parameter should not be null and should inherit from IComparable\".", Justification = "<Pending>", Scope = "member", Target = "~M:NuGet.PackageManagement.UI.NotEqualConverter.Convert(System.Object,System.Type,System.Object,System.Globalization.CultureInfo)~System.Object")]
@@ -30,7 +29,6 @@
3029
[assembly: SuppressMessage("Build", "CA1062:In externally visible method 'Task<IModalProgressDialogSession> NuGetUIContext.StartModalProgressDialogAsync(string caption, ProgressDialogData initialData, INuGetUI uiService)', validate parameter 'initialData' is non-null before using it. If appropriate, throw an ArgumentNullException when the argument is null or add a Code Contract precondition asserting non-null argument.", Justification = "<Pending>", Scope = "member", Target = "~M:NuGet.PackageManagement.UI.NuGetUIContext.StartModalProgressDialogAsync(System.String,NuGet.PackageManagement.UI.ProgressDialogData,NuGet.PackageManagement.UI.INuGetUI)~System.Threading.Tasks.Task{NuGet.PackageManagement.UI.IModalProgressDialogSession}")]
3130
[assembly: SuppressMessage("Build", "CA1822:Member ShowFileConflictResolution does not access instance data and can be marked as static (Shared in VisualBasic)", Justification = "<Pending>", Scope = "member", Target = "~M:NuGet.PackageManagement.UI.NuGetUIProjectContext.ShowFileConflictResolution(System.String)~NuGet.ProjectManagement.FileConflictAction")]
3231
[assembly: SuppressMessage("Build", "CA1062:In externally visible method 'PackageDependencyMetadata.PackageDependencyMetadata(PackageDependency serverData)', validate parameter 'serverData' is non-null before using it. If appropriate, throw an ArgumentNullException when the argument is null or add a Code Contract precondition asserting non-null argument.", Justification = "<Pending>", Scope = "member", Target = "~M:NuGet.PackageManagement.UI.PackageDependencyMetadata.#ctor(NuGet.Packaging.Core.PackageDependency)")]
33-
[assembly: SuppressMessage("Build", "CA1062:In externally visible method 'Task PackageDetailControlModel.SetCurrentPackageAsync(PackageItemViewModel searchResultPackage, ItemFilter filter, Func<PackageItemViewModel> getPackageItemViewModel)', validate parameter 'getPackageItemViewModel' is non-null before using it. If appropriate, throw an ArgumentNullException when the argument is null or add a Code Contract precondition asserting non-null argument.", Justification = "<Pending>", Scope = "member", Target = "~M:NuGet.PackageManagement.UI.PackageDetailControlModel.SetCurrentPackageAsync(NuGet.PackageManagement.UI.PackageItemViewModel,NuGet.PackageManagement.UI.ItemFilter,System.Func{NuGet.PackageManagement.UI.PackageItemViewModel})~System.Threading.Tasks.Task")]
3432
[assembly: SuppressMessage("Build", "CA1062:In externally visible method 'int PackageInstallationInfo.CompareTo(PackageInstallationInfo other)', validate parameter 'other' is non-null before using it. If appropriate, throw an ArgumentNullException when the argument is null or add a Code Contract precondition asserting non-null argument.", Justification = "<Pending>", Scope = "member", Target = "~M:NuGet.PackageManagement.UI.PackageInstallationInfo.CompareTo(NuGet.PackageManagement.UI.PackageInstallationInfo)~System.Int32")]
3533
[assembly: SuppressMessage("Build", "CA1822:Member VersionEquals does not access instance data and can be marked as static (Shared in VisualBasic)", Justification = "<Pending>", Scope = "member", Target = "~M:NuGet.PackageManagement.UI.PackageItemViewModel.VersionEquals(NuGet.Versioning.NuGetVersion,NuGet.Versioning.NuGetVersion)~System.Boolean")]
3634
[assembly: SuppressMessage("Build", "CA1822:Member SetConsolidationAutomationProperties does not access instance data and can be marked as static (Shared in VisualBasic)", Justification = "<Pending>", Scope = "member", Target = "~M:NuGet.PackageManagement.UI.PackageManagerTopPanel.SetConsolidationAutomationProperties(System.Windows.Controls.TabItem,System.Int32)")]

src/NuGet.Clients/NuGet.PackageManagement.UI/Models/DetailControlModel.cs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -137,10 +137,12 @@ public void SetCurrentSelectionInfo(
137137
/// </summary>
138138
/// <param name="searchResultPackage">The package to be displayed.</param>
139139
/// <param name="filter">The current filter. This will used to select the default action.</param>
140+
/// <param name="cancellationToken">Cancellation token for async operations.</param>
140141
public async virtual Task SetCurrentPackageAsync(
141142
PackageItemViewModel searchResultPackage,
142143
ItemFilter filter,
143-
Func<PackageItemViewModel> getPackageItemViewModel)
144+
Func<PackageItemViewModel> getPackageItemViewModel,
145+
CancellationToken cancellationToken)
144146
{
145147
// Clear old data
146148
ClearVersions();
@@ -156,7 +158,7 @@ public async virtual Task SetCurrentPackageAsync(
156158
OnPropertyChanged(nameof(IconBitmap));
157159
OnPropertyChanged(nameof(PrefixReserved));
158160

159-
Task<IReadOnlyCollection<VersionInfoContextInfo>> getVersionsTask = searchResultPackage.GetVersionsAsync(_nugetProjects);
161+
Task<IReadOnlyCollection<VersionInfoContextInfo>> getVersionsTask = searchResultPackage.GetVersionsAsync(_nugetProjects, cancellationToken);
160162

161163
_projectVersionConstraints = new List<ProjectVersionConstraint>();
162164

@@ -235,7 +237,7 @@ public async virtual Task SetCurrentPackageAsync(
235237
(searchResultPackage.Version, false, false)
236238
};
237239

238-
await CreateVersionsAsync(CancellationToken.None);
240+
await CreateVersionsAsync(cancellationToken);
239241
NuGetUIThreadHelper.JoinableTaskFactory.RunAsync(OnCurrentPackageChanged)
240242
.PostOnFailure(nameof(DetailControlModel), nameof(OnCurrentPackageChanged));
241243

@@ -254,12 +256,12 @@ public async virtual Task SetCurrentPackageAsync(
254256
.Select(GetVersion)
255257
.ToList();
256258

257-
await CreateVersionsAsync(CancellationToken.None);
259+
await CreateVersionsAsync(cancellationToken);
258260
NuGetUIThreadHelper.JoinableTaskFactory.RunAsync(OnCurrentPackageChanged)
259261
.PostOnFailure(nameof(DetailControlModel), nameof(OnCurrentPackageChanged));
260262

261263
(PackageSearchMetadataContextInfo packageSearchMetadata, PackageDeprecationMetadataContextInfo packageDeprecationMetadata) =
262-
await searchResultPackage.GetDetailedPackageSearchMetadataAsync();
264+
await searchResultPackage.GetDetailedPackageSearchMetadataAsync(cancellationToken);
263265

264266
if (packageSearchMetadata != null)
265267
{
@@ -640,7 +642,7 @@ private async ValueTask SelectedVersionChangedAsync(PackageItemViewModel package
640642
{
641643
// Load the detailed metadata that we already have and check to see if this matches what is selected, we cannot use the _metadataDict here unfortunately as it won't be populated yet
642644
(PackageSearchMetadataContextInfo packageSearchMetadata, PackageDeprecationMetadataContextInfo packageDeprecationMetadata) =
643-
await packageItemViewModel.GetDetailedPackageSearchMetadataAsync();
645+
await packageItemViewModel.GetDetailedPackageSearchMetadataAsync(cancellationToken);
644646
if (packageSearchMetadata != null && packageSearchMetadata.Identity.Version.Equals(nugetVersion))
645647
{
646648
if (_searchResultPackage != packageItemViewModel)

src/NuGet.Clients/NuGet.PackageManagement.UI/Models/PackageDetailControlModel.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@ public PackageDetailControlModel(
3838
public async override Task SetCurrentPackageAsync(
3939
PackageItemViewModel searchResultPackage,
4040
ItemFilter filter,
41-
Func<PackageItemViewModel> getPackageItemViewModel)
41+
Func<PackageItemViewModel> getPackageItemViewModel,
42+
CancellationToken cancellationToken)
4243
{
4344
// Set InstalledVersion before fetching versions list.
4445
PackageLevel = searchResultPackage.PackageLevel;
@@ -55,7 +56,7 @@ public async override Task SetCurrentPackageAsync(
5556

5657
OnPropertyChanged(nameof(VersionsView));
5758

58-
await base.SetCurrentPackageAsync(searchResultPackage, filter, getPackageItemViewModel);
59+
await base.SetCurrentPackageAsync(searchResultPackage, filter, getPackageItemViewModel, cancellationToken);
5960

6061
// SetCurrentPackage can take long time to return, user might changed selected package.
6162
// Check selected package.

src/NuGet.Clients/NuGet.PackageManagement.UI/PackageItemLoader.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -329,13 +329,13 @@ public IEnumerable<PackageItemViewModel> GetCurrent()
329329

330330
if (listItem.PackageLevel == PackageLevel.TopLevel)
331331
{
332-
listItem.UpdatePackageStatusAsync(_installedPackages)
332+
listItem.UpdatePackageStatusAsync(_installedPackages, CancellationToken.None)
333333
.PostOnFailure(nameof(PackageItemLoader), nameof(GetCurrent));
334334
}
335335
else
336336
{
337337
listItem.UpdateTransitiveInfo(metadataContextInfo);
338-
listItem.UpdateTransitivePackageStatusAsync()
338+
listItem.UpdateTransitivePackageStatusAsync(CancellationToken.None)
339339
.PostOnFailure(nameof(PackageItemLoader), nameof(GetCurrent));
340340
}
341341

0 commit comments

Comments
 (0)