2009-07-13 6 views
1

Je souhaite implémenter un délai d'attente sur l'exécution de tâches dans un projet utilisant le CCR. Fondamentalement, lorsque je poste un élément sur un port ou mettez en file d'attente une tâche vers une DispatcherQueue, je veux être en mesure d'annuler la tâche ou le thread sur lequel elle s'exécute si cela prend plus de temps que prévu. Comment puis-je faire ceci?Comment abandonner les threads/tâches CCR?

+0

Cool. Question de robotique. – Will

Répondre

2

Pouvez-vous confirmer ce que vous demandez? Exécutez-vous une tâche de longue durée dans Dispatcher? Tuer le thread casserait le modèle CCR, donc vous devez être en mesure de signaler au thread pour terminer son travail et son 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 d'assurer le fil de blocage est disponible une référence à resultTimeoutPort. Dans la boucle de blocage, l'une des conditions de sortie pourraient être:

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

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

+0

Vous vous dirigez dans la bonne direction, sauf que j'essayais d'éviter d'avoir à modifier le code de travail foomungus. Aussi ce code ne peut pas toujours avoir une boucle parfois je veux juste qu'il essaie de terminer dans le temps t et s'en aller s'il ne peut pas. J'ai fait quelques lectures et il semble qu'il n'y ait pas de moyen d'obtenir le comportement exact que je veux parce que je casserais le modèle comme vous l'avez dit. – SpaceghostAli

+0

En effet, sans tuer un fil, je pense que vous êtes coincé avec la signalisation à la caution rapidement. Qu'essayez-vous d'accomplir? Peut-être y a-t-il une façon différente de s'attaquer au problème? – spender

0

Vous pouvez enregistrer le thread (Thread.CurrentThread) au début de votre gestionnaire "Receive" CCR (ou dans une méthode qui appelle votre méthode via un délégué). Ensuite, vous pouvez effectuer votre vérification périodique et annuler si nécessaire, de la même manière que vous l'auriez fait si vous avez créé le fil manuellement. Le problème est que si vous utilisez votre propre Microsoft.Ccr.Core.Dispatcher avec un nombre fixe de threads, je ne pense pas qu'il existe un moyen de récupérer ces threads une fois que vous les avorter (en fonction de mes tests). Donc, si votre répartiteur a 5 threads, vous ne pourrez annuler que 5 fois avant de poster ne fonctionnera plus quelles que soient les tâches enregistrées. Cependant, si vous construisez un DispatcherQueue en utilisant le pool de threads CLR, tous les threads CCR que vous annulez seront automatiquement remplacés et vous n'aurez plus ce problème. D'après ce que j'ai vu, bien que le répartiteur CCR soit recommandé, je pense que l'utilisation du pool de threads CLR est la meilleure façon de procéder dans cette situation.

Questions connexes