SqlDataAdapter.Remplissez - approche Asynchrone
À L'Aide De C# /.NET 3.5.
Actuellement, je suis le remplissage de 2 tables de données, l'un après l'autre à l'aide de SqlDataAdapter.Fill().
Je veux remplir les deux de ces tables de données en parallèle, dans le même temps, en faisant de chacun de manière asynchrone. Cependant, il n'existe pas de version asynchrone de la méthode Fill () - c'est à dire BeginFill() serait génial!
Une approche que j'ai essayé est (pseudo):
- SqlCommand1.BeginExecuteReader //1ère requête, pour DataTable1
- SqlCommand2.BeginExecuteReader //2ème requête, pour DataTable2
- SqlCommand1.EndExecuteReader
- SqlCommand2.EndExecuteReader
- DataTable1.Charge(DataReader1)
- DataTable2.Charge(DataReader2)
Cependant, DataTable.Load() prend un temps fou:
Il faut 3 secondes pour faire l'étape 1 à l'étape 4.
L'étape 5, puis s'effectue en 22 secondes.
Étape 6 dure 17 secondes.
Donc, combinée 39 secondes pour les étapes 5 et 6.
Le résultat final est, cela me donne ne sont pas plus juste de faire 2 SqlDataAdapter.Remplit, l'un après l'autre. Je veux le résultat net pour que l'ensemble du processus ne prend que tant que la plus longue de la requête (ou aussi proche que possible).
La recherche de moyens recommandés avant de se retrouver avec quelque chose qui est vraiment une approche asynchrone à remplir un DataTable.
Ou dois-je simplement gérer moi-même et rouleau de 2 threads séparés, chacun remplissant une DataTable?
OriginalL'auteur AdaTheDev | 2010-01-21
Vous devez vous connecter pour publier un commentaire.
Je suggère d'avoir un thread de travail séparé pour chaque. Vous pouvez utiliser ThreadPool.QueueUserWorkItem.
J'ai ajouté l'attente concept à ma réponse, si cela aide.
vous utilisez AutoResetEvents qui vous permettraient de déclencher après le travail est terminé (à l'intérieur de chaque thread séparé). Voir @Neils réponse comme il l'a déjà fourni un exemple.
J'ai mis à jour pour vous montrer (si j'utilise mon exemple) comment vous pourriez le mettre en œuvre.
Grâce (à la fois). Je suis en cours d'exécution sur un Thread STA, ce qui signifie que je ne peux pas utiliser WaitHandle.WaitAll ("WaitAll pour plusieurs poignées sur un thread STA n'est pas pris en charge"). Est-il une alternative?
OriginalL'auteur James
C'est parce que le
DataTable
a beaucoup d'objets à créer (des lignes, des valeurs). Vous devez avoir de l'exécution de l'adaptateur et de la population d'un datatable dans un autre thread, et de synchroniser en attente pour chaque opération de finition avant de continuer.Le code suivant a été écrit dans le bloc-notes et n'a probablement même pas compiler, mais j'espère que vous avez compris l'idée...
Vous pouvez fournir un
Action
de rappel, qui ne fait que le bit suivant de code quand il a été appelé nombre de fois suffisant? Pas très joli, mais devrait fonctionner.Bravo pour la suggestion & aider. J'ai eu assez de travail à faire ce que je voulais (il n'y a aucun avantage réel l'exécution de requêtes en parallèle comme a ensuite fait valoir les uns avec les autres). +1 pour la réponse, comme il l'a fait de l'aide.
OriginalL'auteur Neil Barnwell