Skip to content

Commit

Permalink
ClearPackage List deadlock fix
Browse files Browse the repository at this point in the history
  • Loading branch information
zhili1208 committed Sep 20, 2016
1 parent 4cccb13 commit 150a732
Showing 1 changed file with 21 additions and 14 deletions.
Expand Up @@ -89,9 +89,9 @@ public bool CheckBoxesEnabled

// Load items using the specified loader
internal void LoadItems(
IPackageItemLoader loader,
string loadingMessage,
INuGetUILogger logger,
IPackageItemLoader loader,
string loadingMessage,
INuGetUILogger logger,
Task<SearchResult<IPackageSearchMetadata>> searchResultTask)
{
_loader = loader;
Expand Down Expand Up @@ -243,7 +243,7 @@ private async Task<IEnumerable<PackageItemListViewModel>> LoadNextPageAsync(IPac
await currentLoader.LoadNextAsync(progress, token);

// run till first results are ready
while(currentLoader.State.LoadingStatus == LoadingStatus.Loading &&
while (currentLoader.State.LoadingStatus == LoadingStatus.Loading &&
currentLoader.State.ItemsCount == 0)
{
token.ThrowIfCancellationRequested();
Expand Down Expand Up @@ -280,7 +280,7 @@ private void HandleItemLoaderStateChange(IItemLoader<PackageItemListViewModel> l
// decide when to show status bar
var desiredVisibility = EvaluateStatusBarVisibility(loader, state);
if (_loadingStatusBar.Visibility != Visibility.Visible
if (_loadingStatusBar.Visibility != Visibility.Visible
&& desiredVisibility == Visibility.Visible)
{
_loadingStatusBar.Visibility = desiredVisibility;
Expand Down Expand Up @@ -346,7 +346,7 @@ private void UpdatePackageList(IEnumerable<PackageItemListViewModel> packages, b
if (refresh)
{
ClearPackageList();
ClearPackageList(withLock: false);
}
// add newly loaded items
Expand All @@ -367,23 +367,30 @@ private void UpdatePackageList(IEnumerable<PackageItemListViewModel> packages, b
});
}

private void ClearPackageList()
private void ClearPackageList(bool withLock = true)
{
foreach (var package in PackageItems)
{
package.PropertyChanged -= Package_PropertyChanged;
}

_itemsLock.Wait();

try
if (withLock)
{
Items.Clear();
}
_itemsLock.Wait();

try
{
Items.Clear();
}

finally
finally
{
_itemsLock.Release();
}
}
else
{
_itemsLock.Release();
Items.Clear();
}

_loadingStatusBar.ItemsLoaded = 0;
Expand Down

0 comments on commit 150a732

Please sign in to comment.