#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
, например, в.