2009-05-13 7 views

Répondre

1

BeginExecuteNonQuery ne fonctionne pas?

+1

Il est certainement le cas avec Oracle qu'il n'y a pas BeginExecuteNonQuery. Je ne connais pas le fournisseur de données DB2 .NET. Pour Oracle, j'ai dû faire la fonctionnalité asynchrone moi-même. – RichardOD

0

Le problème est qu'il n'y a pas BeginExecuteNonQuery.

2

Il y a un certain nombre de façons dont l'une dépend de votre scénario. Ce que je faisais dans Oracle consistait à récupérer des milliers d'éléments XML à partir d'une base de données en fonction d'une file d'attente d'ID d'éléments de travail. Les sortir en une fois avec un lecteur de données ne fonctionnait pas, alors je les ai sortis un à la fois sur plusieurs threads différents (chaque thread a sorti un élément de travail d'une file d'attente jusqu'à ce que la file d'attente soit vide). Comme chaque thread séparé a obtenu le résultat, il a mis le XML dans une file d'attente de producteur-un basé sur Joseph Albahari's excellent threading tutorial. Un fil séparé a regardé la file d'attente du producteur, a effectué des transformations XSL sur les données et les a écrites dans un fichier - bien sûr, j'ai fait un benchmarking en un seul thread, ce qui était beaucoup plus lent. J'ai essayé d'utiliser le threadpool/asynchronous delegates pour commencer (comme le conseil général sur le threading est d'utiliser le threadpool si possible, ce que les délégués font indirectement aussi), ce qui peut fonctionner si vous n'avez pas plus de 64 éléments faire. WaitHandle.WaitAll usually has a limit of 64 work items.. Comme j'avais des 1000, ce n'était pas une bonne option, à part de les faire en lots 64 qui semblaient kludgy. De la mémoire j'ai quitté gracieusement les threads de production quand il n'y avait plus de travail pour chacun à faire, puis bloquer jusqu'à ce que la file d'attente du producteur soit également vide. Le plus important est de vous assurer que vous avez des objets DB complètement séparés sur chaque thread, sinon vous tomberez sur des problèmes de threads.

Si vous souhaitez exécuter une seule procédure stockée asynchrone dans une application Windows/WPF, vous pouvez utiliser le background worker component. Faites-moi savoir si vous avez besoin d'informations supplémentaires.

1

Si DB2 ne prend pas en charge BeginExecuteReader, vous pouvez utiliser des délégués asynchrones pour effectuer l'opération. Fonctionnellement, ce serait la même chose, sauf que vous l'implémentiez vous-même plutôt que d'utiliser quelque chose de intégré.

Vérifiez l'exemple ici: sql async query problem…

Questions connexes