Async и CancellationTokens / CancellationTokenSource - проблема с памятью - PullRequest
0 голосов
/ 15 марта 2012

Я все еще нахожусь в своем поиске утечки памяти, и я заметил следующее:

У меня есть много живых экземпляров System.Threading.CancellationCallbackInfo-Objects, поступающих из default-CancellationTokenSource F # (Async-Workflows).

Проблема становится еще хуже, если вы сами объявляете источник и используете его внутри MailboxProcessor для охвата дочерних объектов или задач.

Похоже, что сборщик мусора не может собирать эти составные задачи / рабочие процессы, потому чтоCancellationTokenSource содержит ссылки вроде этого: enter image description here

Большинство из них CancellationCallbackInfo-Objects попадает в Gen2 - невероятно, поскольку я просто использую локальные ссылки внутри рабочего процесса MailboxProcessors- "loop" ...

Это известная проблема, и есть ли решение / обходной путь?

На данный момент я прекратил использовать поддержку отмены и пропустил поток ManualResetEvents через код для этого ... совсем не приятно: (

1 Ответ

3 голосов
/ 15 марта 2012

Если вы используете StartChild, там есть утечка (см. Также this ), которая будет исправлена ​​в следующем выпуске.Вы можете обойти это, используя StartAsTask.

Хорошей практикой является использование собственного CancellationTokenSource для создания токена и явная передача токена в асинхронные F #, чтобы вы могли DisposeCTS на ваших собственных условиях.

(Если вы видите другую утечку, которая не включает StartChild, мы хотели бы маленькое репро, поэтому мы можем это исправить!)

...