Tcp server messenger awaiter in f#
The first thing is when you use parenthesis it means that you pass a tuple to a function instead of single parameters. So you can ditch them.

The second thing is that bool supports pattern matching

The third thing is that you can use recursion instead of mutable variables. Note the usage of rec which enables tail call optimisation. 

The code would look something like this. 

let rec private WaitForData2 (client : TcpClient) (dataLength : int) (loopBreaker : bool) (result: bool) : Async&lt;bool&gt;= 
    async {
        match loopBreaker with
        | true -&gt; 
            let isConnectionAlive : bool = IsConnectionEstablished client &amp;&amp; client &lt;&gt; null
            match isConnectionAlive, client.Available &gt;= dataLength with
            | true, true -&gt;             
                Task.Delay(500) 
                |&gt; Async.AwaitTask 
                |&gt; ignore
                return! WaitForData2 client dataLength false true                
            | false, _ -&gt; 
                Task.Delay(500) 
                |&gt; Async.AwaitTask 
                |&gt; ignore
                return! WaitForData2 client dataLength false false
            | _, _ -&gt; 
                Task.Delay(500) 
                |&gt; Async.AwaitTask 
                |&gt; ignore
                return! WaitForData2 client dataLength true false
        | false -&gt; return result