2013-03-14 8 views
2

Tous -Quelle option de multithreading C# utiliser

Plus d'une question d'approche. J'ai un service web dont j'ai besoin pour tester la performance depuis un ordinateur client. Donc en substance je suis en train d'écrire une application multi-thread rapide WPF (qui a un jauge/compteur de vitesse en elle) pour indiquer visuellement le temps de demande/réponse. Event-driven - donc quand je clique sur un bouton - l'application va commencer à faire des demandes. Je suis seulement préoccupé par combien de temps il a fallu pour la demande/réponse et pas la valeur de Resposne elle-même (pour l'instant).

Voici mon processus de pensée actuellement:

1) Je dois créer autant de threads que je peux (que ma machine cliente peut prendre en charge) et mesurer la performance. 2 options que je peux penser - créer un nouveau mécanisme Thread (donc j'ai un contrôle total sur le thread) ou en utilisant un mécanisme d'arrière-plan (afin que je puisse transmettre cette valeur du traitement en arrière à l'interface utilisateur). Hypothèse - devra faire une boucle dans le code de création du thread - donc peut continuer à créer plusieurs threads pour les deux approches.

2) Dont besoin des progrès de rapports et donc qui ne sont pas des critères pour le choix d'une approche

3) multi-thread Avez-vous besoin d'une méthode de rappel - car cela devrait passer de nouveau la valeur (temps pris pour une demande/réponse au service web)

4) Lorsque je mets à jour une variable avec une valeur, j'utiliserai l'une des méthodes de synchronisation disponibles.

5) Havent a vraiment utilisé l'API Task de la structure 4.0 - mais c'est quelque chose que je devrais considérer.

Est-ce que la ligne d'approche ci-dessus a l'air bien - ou est-ce qu'il me manque quelque chose?

Vraiment apprécier toute aide !!!

+4

Oui, Oui et Oui une fois de plus pour les tâches!Les tâches sont étonnantes, avec des tâches cette tâche entière est juste une simple boucle PLINQ, créant des webrequests et attendant des réponses. –

+0

@BenjaminGruenbaum +1 pour PLINQ. Je l'ai utilisé à plusieurs reprises maintenant et c'est super facile et génial pour ce genre de chose. –

+0

Tout à fait d'accord avec @BenjaminGruenbaum –

Répondre

1

Beaucoup de gens ont recommandé des tâches, ce qui est une bonne idée, je pense. Cela ne me dérange pas d'utiliser des fils nus moi-même, et aussi loin que celui que vous devriez utiliser, tout ira bien. La principale chose à se méfier est le comportement de gestion des exceptions, qui varie entre les deux. Si vous avez une exception non gérée dans un fil typique, il apportera votre processus, de sorte que vous voulez sans doute avoir quelque chose comme ça (ne pas trop simpliste;)):

int errorCount = 0; 

void Run() 
{ 
    Thread t = new Thread(delegate() 
    { 
     try 
     { 
      // your code 
     } 
     catch (Exception) 
     { 
      Interlocked.Increment(ref errorCount); 
     } 
    }); 
} 

D'autre part, les tâches ont façon plus contrôlée de traiter les erreurs - ils les jettent dans un AggregateException lorsque vous appelez la fonction Task.Wait.

Je pense aux exceptions pour votre cas en particulier parce que je suppose que vous vous retrouveriez avec des erreurs de délai lors d'un test de stress. Il est probablement intéressant de regarder aussi, mais honnêtement, puisque vous essayez un test de stress et pas un scénario réel, je pourrais éviter de savoir combien de threads je cours en même temps - je Je crois que les trucs PLINQ font de l'équilibrage de la charge du côté client.

Les méthodes de rappel sont faciles pour toutes ces méthodes. Je voudrais juste utiliser un appel de méthode, plutôt que de passer un rappel, mais c'est un détail d'implémentation. Je resterais à l'écart de BackgroundWorker, car il est vraiment destiné aux opérations asynchrones liées à l'interface utilisateur, et est peut-être un peu gonflé dans ce contexte particulier.

+1

Les tâches sont bien plus que de simples discussions. Eric Lippert l'a clairement indiqué sur son blog plusieurs fois. Lorsque vous lancez une tâche, il se peut qu'elle ne déclenche pas un thread (elle peut par exemple utiliser un événement.) Dans le contexte des requêtes HTTP, par exemple, une approche basée sur les événements peut être bien meilleure qu'une approche par thread –

+0

pouvez vous fournir des références? –