This bit of F# code (which translates essentially word for word into C#) exposes the issue:
let req = System.Net.HttpWebRequest.Create("http://httpbin.org/post")
req.Method <- "POST"
let cb = new System.AsyncCallback(fun iar -> printfn "Sync #1?: %A" iar.CompletedSynchronously)
let iar = req.BeginGetRequestStream(cb, null)
printfn "Sync #2?: %A" iar.CompletedSynchronously
use s = req.EndGetRequestStream(iar)
let x = System.Text.Encoding.ASCII.GetBytes("test=foo")
do! s.AsyncWrite(x, 0, x.Length)
} |> Async.RunSynchronously
Sync #2?: false
Sync #1?: true
I believe these two should agree. (In CLR they are both false).
This causes a deadlock in FSharp.Data when doing HTTP POST requests on Mono (but not CLR) as shown on https://github.com/fsharp/FSharp.Data/issues/762#issuecomment-67425153
Though I haven't exactly pinned it down, I believe the issue is in one of: