From 87560fd8c856276dc322058c1c9fafd0decf7cb0 Mon Sep 17 00:00:00 2001 From: JeyDim Date: Thu, 16 Apr 2026 13:55:14 +0400 Subject: [PATCH 1/6] =?UTF-8?q?fix:=20=D1=80=D0=B0=D0=B7=D0=BB=D0=B8=D1=87?= =?UTF-8?q?=D0=B0=D0=B5=D0=BC=20=D0=BE=D1=82=D0=BC=D0=B5=D0=BD=D1=83=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D0=B5?= =?UTF-8?q?=D0=BB=D1=8F=20=D0=B8=20HTTP-=D1=82=D0=B0=D0=B9=D0=BC=D0=B0?= =?UTF-8?q?=D1=83=D1=82=20=D0=B2=20polling=20loop?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Max.BotClient/Max.BotClient.Polling.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Max.BotClient/Max.BotClient.Polling.cs b/src/Max.BotClient/Max.BotClient.Polling.cs index 3552cfb..bde84b2 100644 --- a/src/Max.BotClient/Max.BotClient.Polling.cs +++ b/src/Max.BotClient/Max.BotClient.Polling.cs @@ -92,7 +92,7 @@ public static async Task ReceiveAsync( ); marker = newMarker; } - catch (OperationCanceledException) + catch (OperationCanceledException) when (cancellationToken.IsCancellationRequested) { return; } @@ -120,7 +120,7 @@ public static async Task ReceiveAsync( updates = result.Item1; marker = result.Item2 ?? marker; } - catch (OperationCanceledException) + catch (OperationCanceledException) when (cancellationToken.IsCancellationRequested) { break; } @@ -138,7 +138,7 @@ public static async Task ReceiveAsync( { await updateHandler(botClient, update, cancellationToken); } - catch (OperationCanceledException) + catch (OperationCanceledException) when (cancellationToken.IsCancellationRequested) { return; } From 6353ee6f54790ab183e3bc2daa486d5aec3f8044 Mon Sep 17 00:00:00 2001 From: JeyDim Date: Thu, 16 Apr 2026 13:57:26 +0400 Subject: [PATCH 2/6] =?UTF-8?q?fix:=20=D0=B7=D0=B0=D1=89=D0=B8=D1=82=D0=B0?= =?UTF-8?q?=20errorHandler=20=D0=BE=D1=82=20=D0=B2=D1=8B=D0=B1=D1=80=D0=BE?= =?UTF-8?q?=D1=81=D0=B0=20=D0=B8=D1=81=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B9=20=D0=B2=20polling=20loop?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Max.BotClient/Max.BotClient.Polling.cs | 33 ++++++++++++++++++---- 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/src/Max.BotClient/Max.BotClient.Polling.cs b/src/Max.BotClient/Max.BotClient.Polling.cs index bde84b2..9c150d0 100644 --- a/src/Max.BotClient/Max.BotClient.Polling.cs +++ b/src/Max.BotClient/Max.BotClient.Polling.cs @@ -98,8 +98,15 @@ public static async Task ReceiveAsync( } catch (Exception ex) { - if (errorHandler != null) - await errorHandler(botClient, ex, cancellationToken); + try + { + if (errorHandler != null) + await errorHandler(botClient, ex, cancellationToken); + } + catch + { + // Не позволяем errorHandler убить polling loop + } } } @@ -126,8 +133,15 @@ public static async Task ReceiveAsync( } catch (Exception ex) { - if (errorHandler != null) - await errorHandler(botClient, ex, cancellationToken); + try + { + if (errorHandler != null) + await errorHandler(botClient, ex, cancellationToken); + } + catch + { + // Не позволяем errorHandler убить polling loop + } continue; } @@ -144,8 +158,15 @@ public static async Task ReceiveAsync( } catch (Exception ex) { - if (errorHandler != null) - await errorHandler(botClient, ex, cancellationToken); + try + { + if (errorHandler != null) + await errorHandler(botClient, ex, cancellationToken); + } + catch + { + // Не позволяем errorHandler убить polling loop + } } } } From 1d079c78c43152d57e49f18065f1adca7bcec132 Mon Sep 17 00:00:00 2001 From: JeyDim Date: Thu, 16 Apr 2026 13:58:45 +0400 Subject: [PATCH 3/6] =?UTF-8?q?fix:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20backoff=20(5=20=D1=81=D0=B5=D0=BA)=20=D0=BC?= =?UTF-8?q?=D0=B5=D0=B6=D0=B4=D1=83=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B0?= =?UTF-8?q?=D0=BC=D0=B8=20=D0=B2=20polling=20loop?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Max.BotClient/Max.BotClient.Polling.cs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/Max.BotClient/Max.BotClient.Polling.cs b/src/Max.BotClient/Max.BotClient.Polling.cs index 9c150d0..0559f2f 100644 --- a/src/Max.BotClient/Max.BotClient.Polling.cs +++ b/src/Max.BotClient/Max.BotClient.Polling.cs @@ -143,6 +143,16 @@ public static async Task ReceiveAsync( // Не позволяем errorHandler убить polling loop } + // Backoff перед повторной попыткой, чтобы не забивать API при длительном сбое + try + { + await Task.Delay(TimeSpan.FromSeconds(5), cancellationToken); + } + catch (OperationCanceledException) + { + break; + } + continue; } From f4d061af52173082704b42c18081e0292a30cb73 Mon Sep 17 00:00:00 2001 From: JeyDim Date: Thu, 16 Apr 2026 14:00:05 +0400 Subject: [PATCH 4/6] =?UTF-8?q?fix:=20=D1=83=D1=81=D1=82=D0=B0=D0=BD=D0=BE?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=20=D0=B1=D0=B5=D1=81=D0=BA=D0=BE=D0=BD?= =?UTF-8?q?=D0=B5=D1=87=D0=BD=D1=8B=D0=B9=20=D1=82=D0=B0=D0=B9=D0=BC=D0=B0?= =?UTF-8?q?=D1=83=D1=82=20HttpClient=20=D0=B4=D0=BB=D1=8F=20long=20polling?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Max.BotClient/Max.BotClient.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Max.BotClient/Max.BotClient.cs b/src/Max.BotClient/Max.BotClient.cs index 2c48f07..a45fb21 100644 --- a/src/Max.BotClient/Max.BotClient.cs +++ b/src/Max.BotClient/Max.BotClient.cs @@ -39,6 +39,7 @@ public BotClient( _httpClient = httpClient ?? new HttpClient(); _httpClient.BaseAddress = new Uri(_options.ApiUrl); _httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", _options.Token); + _httpClient.Timeout = System.Threading.Timeout.InfiniteTimeSpan; } public BotClient( From 0a357cef6cc4348a2cb5913f6ae88562fccf350e Mon Sep 17 00:00:00 2001 From: JeyDim Date: Thu, 16 Apr 2026 14:01:17 +0400 Subject: [PATCH 5/6] =?UTF-8?q?fix:=20StartReceiving=20=D0=B2=D0=BE=D0=B7?= =?UTF-8?q?=D0=B2=D1=80=D0=B0=D1=89=D0=B0=D0=B5=D1=82=20Task=20=D0=B2?= =?UTF-8?q?=D0=BC=D0=B5=D1=81=D1=82=D0=BE=20void?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Max.BotClient/Max.BotClient.Polling.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Max.BotClient/Max.BotClient.Polling.cs b/src/Max.BotClient/Max.BotClient.Polling.cs index 0559f2f..b8b508d 100644 --- a/src/Max.BotClient/Max.BotClient.Polling.cs +++ b/src/Max.BotClient/Max.BotClient.Polling.cs @@ -42,19 +42,19 @@ public static partial class BotClientApiMethods /// Обработчик ошибок (необязательно). /// Опции polling. /// Токен отмены. - public static void StartReceiving( + public static Task StartReceiving( this IBotClient botClient, Func updateHandler, Func? errorHandler = null, ReceiverOptions? options = null, CancellationToken cancellationToken = default - ) => Task.Run(() => + ) => Task.Run(() => botClient.ReceiveAsync( - updateHandler, - errorHandler, - options, + updateHandler, + errorHandler, + options, cancellationToken - ), + ), cancellationToken ); From 86271ca81fbcc12f1420ce692caeb5a9dea3cdc5 Mon Sep 17 00:00:00 2001 From: JeyDim Date: Thu, 16 Apr 2026 16:20:59 +0400 Subject: [PATCH 6/6] =?UTF-8?q?fix:=20=D0=BD=D0=B5=20=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D0=BE=D0=BF=D1=80=D0=B5=D0=B4=D0=B5=D0=BB=D1=8F=D0=B5?= =?UTF-8?q?=D0=BC=20=D0=B3=D0=BB=D0=BE=D0=B1=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B?= =?UTF-8?q?=D0=B9=20Timeout?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Max.BotClient/Max.BotClient.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Max.BotClient/Max.BotClient.cs b/src/Max.BotClient/Max.BotClient.cs index a45fb21..2c48f07 100644 --- a/src/Max.BotClient/Max.BotClient.cs +++ b/src/Max.BotClient/Max.BotClient.cs @@ -39,7 +39,6 @@ public BotClient( _httpClient = httpClient ?? new HttpClient(); _httpClient.BaseAddress = new Uri(_options.ApiUrl); _httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", _options.Token); - _httpClient.Timeout = System.Threading.Timeout.InfiniteTimeSpan; } public BotClient(