title: Why would disposal of resources be delayed when using the "use" binding within an async computation expression?
body: <p>I've got an agent which I set up to do some database work in the background. The implementation looks something like this:</p>
  
  <pre><code>let myAgent = MailboxProcessor&lt;AgentData&gt;.Start(fun inbox -&gt;
      let rec loop = 
          async {
              let! data = inbox.Receive()
              use conn = new System.Data.SqlClient.SqlConnection("...")
              data |&gt; List.map (fun e -&gt; // Some transforms)
                   |&gt; List.sortBy (fun (_,_,t,_,_) -&gt; t)
                   |&gt; List.iter (fun (a,b,c,d,e) -&gt;
                      try
                         ... // Do the database work
                      with e -&gt; Log.error "Yikes")
              return! loop
          }
      loop)
  </code></pre>
  
  <p>With this I discovered that if this was called several times in some amount of time I would start getting SqlConnection objects piling up and not being disposed, and eventually I would run out of connections in the connection pool (I don't have exact metrics on how many "several" is, but running an integration test suite twice in a row could always cause the connection pool to run dry).</p>
  
  <p>If I change the <code>use</code> to a <code>using</code> then things are disposed properly and I don't have a problem:</p>
  
  <pre><code>let myAgent = MailboxProcessor&lt;AgentData&gt;.Start(fun inbox -&gt;
      let rec loop = 
          async {
              let! data = inbox.Receive()
              using (new System.Data.SqlClient.SqlConnection("...")) &lt;| fun conn -&gt;
                data |&gt; List.map (fun e -&gt; // Some transforms)
                     |&gt; List.sortBy (fun (_,_,t,_,_) -&gt; t)
                     |&gt; List.iter (fun (a,b,c,d,e) -&gt;
                        try
                           ... // Do the database work
                        with e -&gt; Log.error "Yikes")
                return! loop
          }
      loop)
  </code></pre>
  
  <p>It seems that the <code>Using</code> method of the AsyncBuilder is not properly calling its finally function for some reason, but it's not clear why. Does this have something to do with how I've written my recursive async expression, or is this some obscure bug? And does this suggest that utilizing <code>use</code> within other computation expressions could produce the same sort of behavior?</p>