-
-
Save kunjee17/3e6d4c6f263a3c543b89 to your computer and use it in GitHub Desktop.
[<CLIMutableAttribute>] | |
[<AliasAttribute("hello")>] | |
type HelloDb = | |
{ Name : string } | |
[<LiteralAttribute>] | |
let connStr = "Server = localhost; Port = 5432; Database = database; User Id = username; password = password;" | |
let dbfactory = OrmLiteConnectionFactory(connStr, PostgreSqlDialect.Provider) | |
let agent = | |
MailboxProcessor.Start(fun inbox -> | |
//let db = dbfactory.Open(); persistance open connection. | |
let rec messageLoop() = | |
async { | |
let! (msg : Hello) = inbox.Receive() | |
do use db = dbfactory.Open() | |
//do some processing | |
db.InsertAsync(msg) | |
|> Async.AwaitTask | |
|> ignore | |
printfn "%A" msg.Name | |
do! Async.Sleep(rnd.Next(100, 1000)) | |
return! messageLoop() | |
} | |
messageLoop()) | |
agent.Post {Name:"Kunjan"} | |
//How can use this agent to insert data. Because if they are queue I guess it is ok to use persistance open connection. Here I am not doing it | |
//but I guess that very much possible |
Is it worth looking at the use expression which takes in a lambda? Might that allow you to better control scope of the connection?
@swlaschin that's new. So, my db is staying there always. Hmmm, I close the connection then I guess. Thanks for reply. First time doing some practical with agents and feeling like James Bond. ;)
As Isaac said, you can use a using
expression, or alternatively, create a new scope by indenting with a do
at the top, like this:
let rec disposingLoop n =
do
// start new scope
use db = newDisposable n
printfn "inside loop %i" n
if n = 0 then
printfn "Loop stopped"
else
disposingLoop (n-1)
disposingLoop 5
Output is:
inside loop 5
disposing 5
inside loop 4
disposing 4
inside loop 3
disposing 3
inside loop 2
disposing 2
inside loop 1
disposing 1
inside loop 0
disposing 0
Loop stopped
@swlaschin and @isaacabraham how can I use do keyword within async keyword. It is giving me compilation error.
If to await an Async, it's do!
@isaacabraham I tried that also. It also didn't work. Can you please give example in context of gist? It will be great help.
@swlaschin and @isaacabraham. I guess I make it working. Please have a look that if it is good as per code. It is working now without closing connection.
And ya we can't use any bang thing in do clause. means that do! will be outside of that clause. Or anything that I should be asynced...
PS: ref - http://stackoverflow.com/questions/7433426/f-async-dispose
Looks good to me. That SO question has good answers too!
Yes, I would manually close the connection before the end.
In fact, I'm not sure that the connection will be closed automatically, as the scope is never exited until the agent stops!
Here's an example that demonstrates this:
Output is: