We are writing a simple application:
- build thousands of SQL select statements
 - run each select using BeginExecuteReader
 - put the results into another database
 
We've tried a few things that either leave connections in a SUSPENDED state (as verified by sp_who2), or take a much longer time to complete than just the SQL query itself (maybe some kind of deadlocking?).
We are:
- calling EndExecuteReader in the callback handler.
 - calling conn.Close() and conn.Dispose()
 - recursively starting another call
 
public static void StartQuery() {
  // build the query for array[i]
  // ...
  SqlConnection conn = new SqlConnection(AsyncConnectionString);
  conn.Open();
  cmd.BeginExecuteReader(CallbackHandler, cmd);
  i++;
}
public static void CallbackHandler(IAsyncResult ar) {
     // unpack the cmd
     cmd.EndExecuteReader();
     // read some stuff to a DataTable...
     // SqlBulkCopy to another database (synchronously)
     cmd.Connection.Close();
     cmd.Connection.Dispose();
     StartQuery();
 }
Does anyone have recommendations or links on a robust pattern to solve this type of problem?
Thanks!