Информация об изменениях

Сообщение F# Утечка памяти при использовании use в rec async от 02.04.2022 16:52

Изменено 04.04.2022 11:49 Разраб

F# Утечка памяти при использовании in
Экспериментировал тут и наткнулся на странность. Баг или фича?

open System
open type System.Console

type Msg = | GetCount of AsyncReplyChannel<int>

let counter = MailboxProcessor<Msg>.Start(fun mb ->  
     let rec loop s = async {                         
         let! (GetCount repl) = mb.Receive()        
         repl.Reply s   
         return! loop (s + 1)                         
         }
     loop 1)

let useColor color = 
    let old = ForegroundColor
    ForegroundColor <- color
    {new IDisposable with member it.Dispose () = ForegroundColor <- old }

let repeat color =

    let rec loop () = async {        
        let! id = counter.PostAndAsyncReply GetCount
        let x = useColor color in do WriteLine $"{id}"; x.Dispose();// если заменить строку на  'use _ = useColor color in do WriteLine $"{id}"' начинает течь память
        return! loop ()
    } 

    loop ()


for e in  ConsoleColor.GetValues() do
    repeat e |> Async.Start
F# Утечка памяти при использовании use в rec async
Экспериментировал тут и наткнулся на странность. Баг или фича?

open System
open type System.Console

type Msg = | GetCount of AsyncReplyChannel<int>

let counter = MailboxProcessor<Msg>.Start(fun mb ->  
     let rec loop s = async {                         
         let! (GetCount repl) = mb.Receive()        
         repl.Reply s   
         return! loop (s + 1)                         
         }
     loop 1)

let useColor color = 
    let old = ForegroundColor
    ForegroundColor <- color
    {new IDisposable with member it.Dispose () = ForegroundColor <- old }

let repeat color =

    let rec loop () = async {        
        let! id = counter.PostAndAsyncReply GetCount
        let x = useColor color in do WriteLine $"{id}"; x.Dispose();// если заменить строку на  'use _ = useColor color in do WriteLine $"{id}"' начинает течь память
        return! loop ()
    } 

    loop ()


for e in  ConsoleColor.GetValues() do
    repeat e |> Async.Start