0

が、私は私の記憶リーク狩りにはまだだと私は次のように気づいた:非同期およびCancellationTokens/CancellationTokenSourceメモリ-問題

私はF#のデフォルトから来るSystem.Threading.CancellationCallbackInfo-オブジェクトのライブインスタンスがたくさんあります-CancellationTokenSource(非同期ワークフロー)。

ソースを自分で宣言し、これをMailboxProcessorの内側で使用して子やタスクにまたがる場合、問題はさらに悪化します。 CancellationTokenSourceは、このような参照を保持しているので、GCは、それらのスパンタスク/ワークフローを収集することはできませんように

は思え: enter image description here

それらCancellationCallbackInfo-オブジェクトのほとんどはGen2のになる - 私はちょうど内部のローカル参照を使用して信じられませんMailboxProcessors- "ループ"ワークフロー...

これは既知の問題ですか?解決策はありますか?私は、このためのコードをキャンセル-サポートとスレッドManualResetEventsを使用して立ち止まった今の

...素敵ではない全く:(

+0

動作を示すサンプルを投稿できますか?それを自分で実行することができなくても問題を分析するのは難しいです... –

+0

私はオフィスのATMにはいませんが、コードに行くとすぐに何かを接続しようとしますが、コアはそれほど難しくありません:この部分はMailboxProcessorからまっすぐに来ています。私は、 "キューに入れられた" IObservable実装のための仕事場として使用します(値はMailboxProcessors-inboxとProcessor "OnNext"すべての登録済みオブザーバにキューイングします)メールボックスプロセッサですが、テール再帰的な非同期の "Check" -Loopコンストラクトで、リモートホストに非同期的にpingしようとするタスクにまたがります – Carsten

答えて

3

あなたがStartChildを使用している場合は、そこに漏れがあります(またthis参照)、これは次のリリースで修正されます。あなたはStartAsTaskを使用して、それを回避することができます。

あなたができるように、トークンを作成するためにCancellationTokenSource独自のものを使用して、明示的にはF#のasyncsにトークンを渡すことをお勧めですDisposeあなた自身の条件でCTS。

StartChildが含まれていない別のリークがある場合は、小さなreproが大好きなので修正できます)

+0

明日この次の事を確認します。私は、タスクを使用するだけで多くのタスクを作成したと思います。 - 同じTokenSourceにリンクされているメモリ内のオブジェクト(これらのタスクオブジェクトはメモリが非常に高価なので、これを止めました) - 私はサブタスクを生成すると思いますAsync.Startを使用すると、実際に結果が必要ないので(最初のバージョンでは、ContinueWithを使用した例外ハンドラを追加しました)、 – Carsten

+0

ここにはStartChildのインスタンスが1つありました。メモリ内のものをロックする簡単な例を見つけることができません...私はあなたの答えをマークすることができると思います – Carsten

関連する問題