Я буду играть адвоката дьявола ... почему вы хотите вызывать их в отдельных потоках, если только один будет выполняться одновременно? Я просто поместил бы рабочие элементы в очередь и по очереди считывал один поток.
EDIT:
Согласно моему комментарию ниже, здесь приведен пример вспомогательного класса, который вы можете использовать для рефакторинга вашего доступа к данным в более централизованное место. Это очень простой пример, не проверенный.
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"]));