2010-02-23 10 views
2

Le scénario auquel je fais face est le suivant. Parce que ThreadPool est 1 instance par processus, ma question est que la méthode 1 annulera-t-elle les tâches mises en file d'attente par la méthode 2 après 3 secondes?Est-il possible de grouper/isoler des tâches dans ThreadPool lors de l'utilisation de WaitHandle.WaitAll?

demande http vient

*method 1 gets executed first*: 

    ThreadPool.QueueUserWorkItem x 3 
    WaitHandle.WaitAll for 3 seconds 

*method 2 gets executed after method 1*: 

    ThreadPool.QueueUserWorkItem x 10 
    WaitHandle.WaitAll for 10 seconds 

Désolé, je pense que je suis totalement mal compris l'utilisation de WaitHandle. Il semble que si je fais ci-dessous tout fonctionnera comme souhaité. Donc désolé pour la confusion.

var calls = new ManualResetEvent[5]; 
//ThreadPool.QueueUserWorkItem blah... 
WaitHandle.WaitAll(calls, timeOut); 

Mais je pense encore ce qui se passera lorsque la méthode 1 inondé pool de threads avec de longues tâches en cours d'exécution et la méthode 2 attend que pour 1 seconde. La méthode 2 retrouvera-t-elle ses résultats parce qu'elle n'attend pas assez longtemps.

Merci.

+0

Je ne vois pas où vous auriez une condition de concurrence ici ... est la méthode 2 en utilisant les données de la méthode 1? Existe-t-il une interaction explicite entre les deux méthodes? – Kiril

Répondre

1

Non, les tâches ne seront pas annulées. Simplement, vous préférez arrêter d'attendre. BTW, ne serait pas plutôt une exception de délai d'attente être levée lorsque WaitAll dépasse timeout?

+0

Je suis un peu confus Donc, vous voulez exécuter Method1 parallèlement 3 fois, puis Method2 parallèlement 10 fois?Ou est la méthode 1 qui lance 3 tâches et ensuite Method2 lance ses 10 tâches? Si c'est le cas, le code ressemble à: {Method1(); WaitAll(); Method2();} et oui, Method2 attend Method1. – user76035

1

Je pense que vous devriez créer votre propre file d'attente + répartiteur pour traiter un groupe de vos actions ou tâches. Le modèle d'objet actif est un bon choix. Vous pouvez contrôler la priorité d'exécution des actions, écrire la règle pour attendre certaines actions dans le groupe (en utilisant la méthode Guard), attendre les résultats "any" ou "all". Vous pouvez lire ceci article, il a du code pour essayer ce modèle en action.

Chance!

+0

Il me semble que cela pourrait me prendre du temps pour le comprendre. – Jeff

1

Comme d'autres l'ont souligné, quand l'attente est terminée method 1 ne sera pas annuler les discussions mises en attente par method 2sauf si vous avez un code explicite dans method 1 qui causent spécifiquement method 2 d'annuler.

Vous avez dit que vous pourriez avoir une condition de course, mais à moins que method 2 se fonde sur method 1 à remplir afin de faire des calculs avec les résultats en method 1, alors il n'y a pas de condition de course apparente dans votre exemple. Veuillez préciser où vous pensez que vous voyez une condition de compétition et pourquoi, à partir de votre exemple actuel, il ne semble pas que vous ayez une condition de compétition.

1

En référence à votre mise à jour:

Soyez au courant si vous utilisez WaitAll avec une application de formulaires de fenêtres qu'il ne fonctionnera pas sans mettre votre point d'entrée à [MTAThread] (que le compilateur échoue sur toute façon).

This enhanced ThreadPool prend en charge le regroupement des éléments de travail (et leur annulation), ce qui peut s'avérer utile si vous recherchez toujours une solution.

+0

@Chris, merci et je vais jeter un coup d'oeil. Mais je pensais selon http://msdn.microsoft.com/en-us/library/aa332365(VS.71).aspx "Le fil n'est pas garanti d'avorter immédiatement, ou pas du tout." – Jeff

+0

@Chirs, en termes de problème [MTAThread], WaitAll fonctionnerait-il en utilisant WCF? – Jeff

+1

@Jeffrey WCF ne devrait pas être un problème si vous exécutez un service (qui sont MTA par défaut) à moins que WCF fasse quelque chose que je ne connais pas avec les pompes winapi et message. Pour le problème d'abandon de thread: "* Cette situation peut se produire si un thread fait une quantité illimitée de calcul dans les blocs finally qui sont appelés dans le cadre de la procédure d'abandon *" - faites-vous cela? WaitAll et WaitHandles étant Mutexes lanceront une 'AbandonedMutexException' –