Ok,Assassinat/Aborting un fil avec une seule tâche géante (par exemple SQL Query)
Il semble y avoir beaucoup de discussions ici sur la façon dont Thread.Abort est vraiment affreux() est, et comment travailler autour de l'utilisation de Thread.Abort() dans votre code en ajoutant des contrôles de sortie dans votre boucle.
Ceci suppose que vous contrôlez la façon dont le travail est partitionné d'une manière suffisamment granulaire pour qu'il soit bouclé dessus.
Mais comment puis-je faire ce qui suit:
thread de travail de lancement pour faire quelque chose tout en gardant l'interface utilisateur réactive. Pour toutes fins utiles le code pour le thread de travail ressemble à ceci:
public override void Run() { try { _dataTable = ExecuteSingleGinormousSqlQuery(); } finally { // close the connection if it was left open. } }
Avez bouton « Annuler » afin que l'utilisateur peut interrompre cela s'ils se lassent d'attendre.
Il ne semble pas exister d'autre moyen de contourner cela qu'avec Thread.Abort(). Est-ce vrai? En outre, dans les tests empiriques, il ne semble même pas que Thread.Abort() tue réellement le thread jusqu'à l'appel qui effectue la requête, par ex.
new SqlDataAdapter(cmd).Fill(ds);
revient en premier lieu, annulant ainsi de manière significative son utilité.
Y a-t-il un moyen de contourner cela? Les meilleures pratiques?
La prison n'est pas la pire conséquence possible. http://xkcd.com/292/ –