Je continue à avoir cette erreur: «tentative d’appel invalide lire quand le lecteur est fermé»

Voici mon code, je ferme et ouvre le lecteur et cela ne fonctionne toujours pas. Quelques threads peuvent accéder à cette fonction simultanément, mais il y a un verrou. Cela fonctionne plusieurs fois au début, mais tôt ou tard, l’exception “Tentative d’appel non valide Lire, lorsque le lecteur est fermé” à

private IList GetUsers(SqlCommand cmd) { IList users = new List(); User user; lock (thisLock) { SqlDataReader dr = null; try { Conn.Open(); dr = cmd.ExecuteReader(CommandBehavior.CloseConnection); while (dr.Read()) { user = new User { UserId = Convert.ToInt32(dr["WorkerNum"]), CompanyName = dr["CompanyName"].ToSsortingng(), WorkerName = dr["WorkerFirstName"] + " " + dr["WorkerFamilyName"], Phone = dr["Phone"].ToSsortingng() }; if (dr["QueueNum"] != null && dr["QueueNum"] != DBNull.Value) { user.Queue = new Queue { HasAlreadyEntered = dr["flgAppear"] != null && dr["flgAppear"].ToSsortingng() == "Y", IsFromWebsite = dr["TookFrom"].ToSsortingng() == "1", IsMelutash = dr["IsMelutash"].ToSsortingng() == "1", TimeOrdered = DateTime.Parse(dr["DateTime1"].ToSsortingng()), QueueNum = Convert.ToInt32(dr["QueueNum"]), SMS = dr["SMSCode"].ToSsortingng() }; } users.Add(user); } } catch (Exception e) { throw e; } finally { if (dr != null) { dr.Close(); dr.Dispose(); } } return users; } } 

Ce qui donne?

Essayons d’améliorer un peu ce code:

 private IEnumerable GetUsers() { using (var conn = new SqlConnection(SomeConnectionSsortingng)) using (var cmd = conn.CreateCommand()) { conn.Open(); cmd.CommandText = "SELECT WorkerNum, CompanyName, ... FROM Users"; using (var reader = cmd.ExecuteReader()) { while (reader.Read()) { var user = new User { UserId = reader.GetInt32(reader.GetOrdinal("WorkerNum")), CompanyName = reader.GetSsortingng(reader.GetOrdinal("CompanyName")), // TODO: complete other fields }; // TODO: do the tests and complete the complex properties yield return user; } } } } 

Maintenant, ce code est parfaitement réentrant et thread-safe. Vous n’avez besoin d’aucun locking.