I'll play devil's advocate... why do you want to invoke them in separate threads if only one will be executing at a time? I would just put the work items into a Queue and have a single thread read off the queue one at a time.
EDIT:
As per my comment below, here is an example of a helper class you could use to refactor your data access into a more centralized place. It's a very basic example and not tested.
class Database {
private string connectionString;
private readonly object syncRoot = new object();
public Database(string connectionString) {
this.connectionString = connectionString;
}
public void ExecuteReader(SqlCommand command, Action<IDataRecord> forEachRow) {
lock (syncRoot) {
using (var connection = new SqlConnection(connectionString)) {
command.Connection = connection;
connection.Open();
using (var reader = command.ExecuteReader()) {
while (reader.Read()) {
forEachRow(reader);
}
}
}
}
}
}
var myDB = new Database("connection string");
var myCommand = new SqlCommand("select id from blah");
myDB.ExecuteReader(myCommand, row => Console.WriteLine("ID: {0}", row["id"]));