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Мы бы хотели маленькую репродукцию, чтобы мы могли это исправить!)

Другие вопросы по тегам