Обратный вызов CancellationTokenSource вызывается для всех запросов

#c# #.net-5 #cancellationtokensource

#c# #.net-5 #источник cancellationtokensource

Вопрос:

Я настроил CancellationTokenSource с обработчиком

 public class AppTimeout {  public async Task Invoke(HttpContext httpContext)  {    var cancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(httpContext.RequestAborted);   cancellationTokenSource.CancelAfter(myTimestamp);     cancellationTokenSource.Token.Register(() =gt;  {   log.info("...");  });    await _next(httpContext);  } }  

Моя проблема в том , что у меня есть только один запрос в тайм-аут, обратный вызов CancellationTokenSource.Токен вызывается для всех запросов, которые были обработаны методом Invoke, даже для запросов, которые уже завершены в нужное время

Знаете ли вы, почему я сталкиваюсь с таким поведением и как это исправить, пожалуйста?

Комментарии:

1. Ну, нет ничего, чтобы избавиться от источника токена отмены, и сбор мусора происходит не сразу, поэтому я ожидаю, что он истекает после завершения запроса.

Ответ №1:

 using var registration = timeoutCancellationTokenSource.Token.Register(() =gt; {   log.info($"timeout path is {path}"); }); // your other code here...  

Теперь он будет правильно отменен после завершения регистрации, т. е. при выходе из области действия using .

Комментарии:

1. @LemecCinq упс, см. редактирование; если вы используете более старый компилятор C#, вам нужно будет использовать более старый using(...) {...} синтаксис

2. Я хотел бы знать , почему использование using-это решение , оно должно использоваться для высвобождения неуправляемых ресурсов , я не вижу, как оно решает проблему, даже если я уверен, что оно ее решает

3. Мне было бы действительно любопытно получить объяснение.

4. @vivien, потому что в некоторых случаях Microsoft использует IDisposable для выполнения других задач, кроме удаления неуправляемых ресурсов.

5. @VivienPipo неуправляемые ресурсы-это всего лишь одно из применений IDisposable . Он используется во многих , многих других местах, в том числе foreach , например, в.