Pourquoi EndExecuteNonQuery () est-il nécessaire?

La documentation ici indique que

les développeurs doivent appeler la méthode EndExecuteNonQuery pour terminer l'opération.

Je n'ai pas été en mesure de find une bonne raison pour laquelle cela est, ou ce que les résultats de ne pas appeler EndExecuteNonQuery sont.

Une idée de ce qui va se passer si elle n'est pas appelée? Je ne veux pas bloquer, y a-t-il un moyen de l'appeler automatiquement dans un AsyncCallback ?

Cela fera des choses comme:

  • mettre à jour les valeurs des parameters (out / return)
  • vérifier les exceptions (codes d'erreur dans le stream TDS – violation des contraintes, etc.)
  • libérer tous les objects / données mis en memory tampon dans le cadre de ce qui précède, etc.

Alors oui: faites-le

Par définition, tous ces appels asynchronouss ne peuvent pas être faits dans un bloc utilisant pour s'assurer que la connection est fermée. En tant que tel, appelez EndExecutexxx est nécessaire.

En regardant le code dans le réflecteur, nous pouvons voir la trace de la fermeture de la connection dans EndExecuteNonQuery :

  SqlDataReader reader = this.CompleteAsyncExecuteReader(); if (reader != null) { reader.Close(); }