diff --git a/TelegramBotBase/Form/AutoCleanForm.cs b/TelegramBotBase/Form/AutoCleanForm.cs index e2db50d..5617775 100644 --- a/TelegramBotBase/Form/AutoCleanForm.cs +++ b/TelegramBotBase/Form/AutoCleanForm.cs @@ -131,6 +131,7 @@ namespace TelegramBotBase.Form { var oldMessages = OldMessages.AsEnumerable(); +#if !NET472 while (oldMessages.Any()) { using var cts = new CancellationTokenSource(); @@ -162,6 +163,43 @@ namespace TelegramBotBase.Form if (retryAfterTask != null) await retryAfterTask; } +#else + while (oldMessages.Any()) + { + using (var cts = new CancellationTokenSource()) + { + var deletedMessages = new ConcurrentBag(); + var parallelQuery = OldMessages.AsParallel() + .WithCancellation(cts.Token); + Task retryAfterTask = null; + try + { + parallelQuery.ForAll(i => + { + Device.DeleteMessage(i).GetAwaiter().GetResult(); + deletedMessages.Add(i); + }); + } + catch (AggregateException ex) + { + cts.Cancel(); + + var retryAfterSeconds = ex.InnerExceptions + .Where(e => e is ApiRequestException apiEx && apiEx.ErrorCode == 429) + .Max(e => (int?)((ApiRequestException)e).Parameters.RetryAfter) ?? 0; + retryAfterTask = Task.Delay(retryAfterSeconds * 1000); + } + + deletedMessages.AsParallel().ForAll(i => Device.OnMessageDeleted(new MessageDeletedEventArgs(i))); + + oldMessages = oldMessages.Where(x => !deletedMessages.Contains(x)); + if (retryAfterTask != null) + await retryAfterTask; + } + } + + +#endif OldMessages.Clear(); } diff --git a/TelegramBotBase/TelegramBotBase.csproj b/TelegramBotBase/TelegramBotBase.csproj index 19fe695..0b31660 100644 --- a/TelegramBotBase/TelegramBotBase.csproj +++ b/TelegramBotBase/TelegramBotBase.csproj @@ -1,7 +1,7 @@  - netstandard2.1;net5;netcoreapp3.1 + netstandard2.1;net472;net5;netcoreapp3.1 false false true