Question

Je veux mettre en œuvre un délai d'attente sur l'exécution des tâches dans un projet qui utilise le CCR. Fondamentalement, quand je poste un article à un port ou ENQUEUE une tâche à un DispatcherQueue je veux être en mesure d'interrompre la tâche ou le fil que son exécution sur si cela prend plus de temps configuré. Comment puis-je faire?

Était-ce utile?

La solution

Pouvez-vous confirmer ce que vous demandez? Courez-vous un travail de longue durée dans le Dispatcher? Tuer le fil casserait le modèle de CCR, vous devez donc être en mesure de signaler au fil pour terminer son travail et le rendement. En supposant qu'il est une boucle qui ne soit pas assez rapide de terminer, vous pouvez choisir de enqueue une minuterie:

var resultTimeoutPort = new Port<DateTime>();
dispatcherQueue.EnqueueTimer(TimeSpan.FromSeconds(RESULT_TIMEOUT), 
                             resultTimeoutPort);

et assurer le fil de blocage est disponible une référence à resultTimeoutPort. Dans la boucle de blocage, l'une des conditions de sortie peut être:

do
{
    //foomungus amount of work
}while(resultTimeoutPort.Test()==null&&
       someOtherCondition)

S'il vous plaît poster plus d'informations si je suis aboyer le mauvais arbre.

Autres conseils

Vous pouvez enregistrer le fil (Thread.currentThread) au début de votre CCR gestionnaire « Recevoir » (ou dans une méthode qui appelle votre méthode via un délégué). Ensuite, vous pouvez faire votre vérification périodique et interrompra si nécessaire essentiellement de la même manière que vous l'auriez fait si vous avez créé le fil manuellement. Le hic est que si vous utilisez votre propre Microsoft.Ccr.Core.Dispatcher avec un nombre fixe de fils, je ne pense pas qu'il y ait un moyen d'obtenir ces fils une fois que vous les interrompez (basé sur mes tests). Donc, si votre répartiteur a 5 fils de discussion, vous ne pourrez annuler 5 fois avant de poster ne fonctionnera plus, peu importe ce que les tâches ont été enregistrées. Toutefois, si vous construisez un DispatcherQueue en utilisant le pool de threads CLR, les fils de CCR vous interrompez seront remplacés automatiquement et vous n'aurez pas ce problème. D'après ce que je l'ai vu, mais il est recommandé au répartiteur CCR, je pense en utilisant le pool de threads CLR est la voie à suivre dans cette situation.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top