Skip to content

Commit 8a788eb

Browse files
committed
Improve error handling of tasks that are not waited anymore due to a timeout (fix #4211, fix #4172)
1 parent ead9dca commit 8a788eb

File tree

3 files changed

+33
-1
lines changed

3 files changed

+33
-1
lines changed

src/UniGetUI.Core.Tools/Tools.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -752,5 +752,20 @@ public static string GetCurrentLocale()
752752
private static readonly HashSet<char> _illegalPathChars = Path.GetInvalidFileNameChars().ToHashSet();
753753
public static string MakeValidFileName(string name)
754754
=> string.Concat(name.Where(x => !_illegalPathChars.Contains(x)));
755+
756+
757+
// Safely wait for a task that may throw an exception we don't care about
758+
public static async void FinalizeDangerousTask(Task t)
759+
{
760+
try
761+
{
762+
await t.ConfigureAwait(false);
763+
}
764+
catch (Exception ex)
765+
{
766+
Logger.Error($"Task {t} crashed with exception:");
767+
Logger.Error(ex);
768+
}
769+
}
755770
}
756771
}

src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/Helpers/BaseSourceHelper.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using UniGetUI.Core.Classes;
22
using UniGetUI.Core.Logging;
33
using UniGetUI.Core.SettingsEngine;
4+
using UniGetUI.Core.Tools;
45
using UniGetUI.PackageEngine.Enums;
56
using UniGetUI.PackageEngine.Interfaces;
67
using UniGetUI.PackageEngine.Interfaces.ManagerProviders;
@@ -64,9 +65,13 @@ public virtual IReadOnlyList<IManagerSource> _getSources()
6465
if (!task.Wait(TimeSpan.FromSeconds(PackageListingTaskTimeout)))
6566
{
6667
if (!Settings.Get(Settings.K.DisableTimeoutOnPackageListingTasks))
68+
{
69+
CoreTools.FinalizeDangerousTask(task);
6770
throw new TimeoutException($"Task _getInstalledPackages for manager {Manager.Name} did not finish after " +
6871
$"{PackageListingTaskTimeout} seconds, aborting. You may disable " +
6972
$"timeouts from UniGetUI Advanced Settings");
73+
}
74+
7075
task.Wait();
7176
}
7277

src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/PackageManager.cs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,9 +234,13 @@ private IReadOnlyList<IPackage> _findPackages(string query, bool SecondAttempt)
234234
if (!task.Wait(TimeSpan.FromSeconds(PackageListingTaskTimeout)))
235235
{
236236
if (!Settings.Get(Settings.K.DisableTimeoutOnPackageListingTasks))
237+
{
238+
CoreTools.FinalizeDangerousTask(task);
237239
throw new TimeoutException($"Task _getInstalledPackages for manager {Name} did not finish after " +
238240
$"{PackageListingTaskTimeout} seconds, aborting. You may disable " +
239241
$"timeouts from UniGetUI Advanced Settings");
242+
}
243+
240244
task.Wait();
241245
}
242246

@@ -273,15 +277,19 @@ private IReadOnlyList<IPackage> _getAvailableUpdates(bool SecondAttempt)
273277
if (!IsReady()) { Logger.Warn($"Manager {Name} is disabled but yet GetAvailableUpdates was called"); return []; }
274278
try
275279
{
276-
Task.Run(RefreshPackageIndexes).Wait(TimeSpan.FromSeconds(60));
280+
Task.Run(RefreshPackageIndexes).Wait(TimeSpan.FromSeconds(PackageListingTaskTimeout));
277281

278282
var task = Task.Run(GetAvailableUpdates_UnSafe);
279283
if (!task.Wait(TimeSpan.FromSeconds(PackageListingTaskTimeout)))
280284
{
281285
if (!Settings.Get(Settings.K.DisableTimeoutOnPackageListingTasks))
286+
{
287+
CoreTools.FinalizeDangerousTask(task);
282288
throw new TimeoutException($"Task _getInstalledPackages for manager {Name} did not finish after " +
283289
$"{PackageListingTaskTimeout} seconds, aborting. You may disable " +
284290
$"timeouts from UniGetUI Advanced Settings");
291+
}
292+
285293
task.Wait();
286294
}
287295

@@ -322,9 +330,13 @@ private IReadOnlyList<IPackage> _getInstalledPackages(bool SecondAttempt)
322330
if (!task.Wait(TimeSpan.FromSeconds(PackageListingTaskTimeout)))
323331
{
324332
if (!Settings.Get(Settings.K.DisableTimeoutOnPackageListingTasks))
333+
{
334+
CoreTools.FinalizeDangerousTask(task);
325335
throw new TimeoutException($"Task _getInstalledPackages for manager {Name} did not finish after " +
326336
$"{PackageListingTaskTimeout} seconds, aborting. You may disable " +
327337
$"timeouts from UniGetUI Advanced Settings");
338+
}
339+
328340
task.Wait();
329341
}
330342

0 commit comments

Comments
 (0)