Je ne suis pas tout à fait sûr si je rencontre un bug ou si je ne comprends pas comment cela fonctionne. Alors récemment, j'ai essayé de résoudre cette exception MySql.Data.MySqlClient.MySqlException: 'There is already an open DataReader associated with this Connection which must be closed first.'
et j'ai commencé une session de débogage pour voir ce qui se passe. Ce que j'ai vu ne calcule pas tout à fait dans ma tête (voir la capture d'écran ci-jointe).MySqlDataReader ne se ferme pas après avoir appelé Close() sur le lecteur
Après avoir appelé reader.Close()
, la propriété IsClosed
reste false, et les appels répétés à .Close()
(dans les fenêtres immédiates) ne modifient pas cela.
Ce comportement est-il attendu et mon problème est ailleurs, ou s'agit-il d'un bogue et de la cause de l'exception? Cela se produit lorsque vous utilisez MySql.Data
v6.10.3-rc (à partir de nuget.org), qui est le seul supportant la norme .NET à ce jour. En outre, le code est compilé à une application .NET Core 2.0.
UPD: Il y a des tâches autour, mais le lecteur n'est traité qu'à partir du thread principal. En outre, reader
est déclaré comme DbDataReader
, dont MySqlDataReader
est héritée.
UPD2: Apparemment, si j'appelle ((MySql.Data.MySqlClient.MySqlDataReader)reader).Close()
, le lecteur se ferme correctement. On dirait que c'est un bug dans le connecteur et comment ils utilisent des méthodes virtuelles. Droite?
êtes-vous dans une tâche asynchrone? – apomene
@apomene Non, en dehors de la tâche, code monothread normal. Il y a des tâches autour mais elles ne traitent pas avec le lecteur, seulement les données extraites du lecteur. – bazzilic
Que se passe-t-il si vous appelez 'lecteur.Dispose()'? Est-ce qu'on s'en débarrasse? – waka