Thread Appelant.Abandon sur un fil à partir d'un pool de threads

Mon collègue est à l'aide d'un tiers .NET à la bibliothèque pour laquelle nous n'avons pas le code source. Nous sommes à l'aide d'un pool de threads pour avoir beaucoup de threads d'appel dans cette bibliothèque, et, occasionnellement, l'un des fils va juste s'accrocher éternellement tandis que le reste d'entre eux gaiement souffler le long.

Si nous voulons utiliser le redoutable Thread.Abort à tuer de tels fils. J'ai fait ça avant, lorsqu'on fait tourner mon propre fils, mais je n'ai jamais utilisé un pool de threads. Si nous suivons les heures de début de chaque tâche comme ceci:

static Dictionary<Thread, DateTime> started = new Dictionary<Thread, DateTime>();

static void DoSomeWork(object foo)
{
    lock(started)
        started[Thread.CurrentThread] = DateTime.Now;

    SomeBuggyLibraryThatMightInfiniteLoopOrSomething.callSomeFunction(doo);

    lock(started)
        started.Remove(Thread.CurrentThread);
}

alors que l'on peut verrouiller et itérer sur les threads en cours d'exécution et d'appel Thread.Abort de le tuer? Et si nous le faisons, alors nous avons besoin d'ajouter un nouveau thread pour le pool de threads pour remplacer celui que l'on vient de tuer, ou le pool de threads poignée pour nous?

EDIT: je suis très conscient de tous les problèmes potentiels avec Thread.Abort. Je sais que l'idéal est de ne jamais être utilisé dans la production de code, et qu'il n'est pas nécessairement le même arrêter le fil, et que si vous interrompre un thread alors que le thread a acquis un verrou, puis vous pouvez raccrocher les autres threads, etc. Mais pour l'instant, nous sommes sur un échéancier serré et nous avons décent des raisons de croire que dans ce cas particulier, on peut appeler Thread.Abort sans mettre l'ensemble du processus en danger, et nous aimerions éviter d'avoir à réécrire ce programme afin d'éliminer le pool de threads à moins que nous devons absolument.

Donc ce que je veux savoir, c'est ceci: étant donné que nous ALLONS appeler Thread.Abort sur un thread qui appartient à un pool de threads, sont des problèmes causés par ces cours de pool de threads les threads, et nous n'avons manuellement à lancer un nouveau thread pour remplacer celui qui a été tué, ou le pool de threads faire cela pour nous?

"[L'abandon d'un pool de threads thread] est périlleux, cependant. Par le temps que la notification est reçue, et le thread est interrompu, l'original de l'élément de travail pourrait avoir déjà fini, tels que le pool de thread déjà passés à un autre élément de travail. Vous serait l'abandon du secondaire d'élément de travail plutôt que de le désirer, à vous ouvrir à un monde de souffrance. "- Stephen Toub, MSDN Magazine n ° 06-03

OriginalL'auteur Eli Courtwright | 2010-02-25