Есть телеграмм-бот, у него есть команда, которая выполняется бесконечно, пока не придет апдейт с командой "/stop".
public override async void Execute(String command, Message message, ITelegramBotClient client, State state)
{
if (message.Text == "/stop")
StopLoop();
if(message.Text == "/start")
StartLoop(message,client);
}
private CancellationTokenSource _cts;
private async Task RunLoopAsync(CancellationToken token,Message message, ITelegramBotClient client )
{
try
{
while (true)
{
await client.SendTextMessageAsync(message.Chat.Id, "send", cancellationToken: token);
await Task.Delay(10000, token);
}
}
catch (OperationCanceledException)
{ }
}
private async void StartLoop(Message message, ITelegramBotClient client)
{
if (_cts != null)
return;
try
{
using (_cts = new CancellationTokenSource())
{
await RunLoopAsync(_cts.Token,message,client);
}
}
catch (Exception ex)
{
// ... ex.Message
}
_cts = null;
}
private void StopLoop()
{
_cts?.Cancel();
}
Для остановки цикла, я взял пример отсюда: пример
Но это не помогает. Что посоветуете сделать, чтобы можно было остановить этот цикл?
if (message.Text == "/stop") StopLoop();код доходит, после чего оно присылает сообщение :"end"(я добавил туда CW, чтобы это увидеть + откладка). Меня смутило только то, что _cts.IsCancellationRequested остается false. – Alex Feb 12 '23 at 19:29ConcurrentDictionaryдля храненияctsподойдёт. Но для одного единственного пользователя то что вы показали,должно работать нормально. – aepot Feb 12 '23 at 19:38