Async и CancellationTokens/CancellationTokenSource - проблема с памятью
Я все еще в поиске утечки памяти, и я заметил следующее:
У меня есть много живых экземпляров System.Threading.CancellationCallbackInfo-Objects, поступающих из default-CancellationTokenSource от F# (Async-Workflows).
Проблема усугубляется, если вы сами объявляете источник и используете его внутри MailboxProcessor для охвата дочерних элементов или задач.
Похоже, что GC не может собирать эти составные задачи / рабочие процессы, потому что CancellationTokenSource содержит ссылки вроде этого:
Большинство из них CancellationCallbackInfo-Objects попадают в Gen2 - невероятно, поскольку я просто использую локальные ссылки внутри рабочего процесса MailboxProcessors-"loop"...
Это известная проблема, и есть ли решение / обходной путь?
На данный момент я перестал использовать Cancellation-support и пропустил ManualResetEvents через код для этого... не очень приятно:(
1 ответ
Если вы используете StartChild
, есть утечка (см. также это), которая будет исправлена в следующем выпуске. Вы можете обойти это, используя StartAsTask
,
Хорошей практикой является использование собственного CancellationTokenSource
создать токен и явно передать токен асинхронам F#, чтобы вы могли Dispose
CTS на ваших собственных условиях.
(Если вы видите другую утечку, которая не связана с StartChild
Мы бы хотели маленькую репродукцию, чтобы мы могли это исправить!)