2010-02-23 6 views
0

Je souhaite créer une application WinForm qui doit extraire des données provenant d'une socket.Interface graphique avec socket dans un autre thread

Je veux mettre le code de lecture d'un socket dans un fil séparé et je suis au courant du modèle InvokeRequired/BeginInvoked.

Quel type de thread C# est le plus adapté à mon objectif compte tenu du scénario WinForm? Est-il suffisant un System.Threading.Thread commun entièrement dédié à la lecture des données de socket ou d'autres types comme BackgroundWorker? Ou devrais-je considérer autre chose?

+0

Aucune signature (ou message d'accueil) nécessaire. – Ricket

Répondre

0

Ce fil est-il actif depuis longtemps? Si vous en avez besoin pour fonctionner longtemps, et si vous n'avez pas besoin d'interagir directement avec une interface graphique (peut-être cachez des données dans un buffer), alors j'utiliserais System.Threading.Thread. J'ai utilisé BackgroundWorker et j'ai trouvé que, bien qu'il vous permet de mettre à jour l'interface graphique via son événement, il utilise le pool de threads .NET. Le pool de threads a une quantité finie de threads disponibles, donc si vous devez utiliser Windows Workflow ou beaucoup de délégués via BeginInvoke, vous risquez de nuire aux performances des applications en attachant trop de threads de pool de threads.

+0

Attacher un thread de pool ne sera pas plus lent (ou mieux) que d'en créer un nouveau. –

+0

Oui! Il fonctionnera pendant des heures avec une énorme quantité de données reçues + il doit mettre à jour également l'interface graphique. Je vais certainement utiliser un cache cache + refresh Gui toutes les n millisecondes puisque le ThreadPool sera définitivement rempli rapidement. Merci! –

+0

@Henk: J'ai eu l'impression que si vous utilisez les threads dans le pool de threads, vous ne pourrez pas lancer un autre thread de pool de threads jusqu'à ce qu'il soit disponible. Si vous ne pouvez pas faire cela, vous ne pouvez pas travailler. Selon cette définition, vous nuiriez aux performances des applications, non? – Dave

2
Thread workerThread = new Thread(); 
// do threadstart parameters or whatever 
workerThread.IsBackground = true; 
workerThread.Start(); 

Cela devrait suffire ... vous pouvez même définir sa priorité si cela est un problème.

Je ne me soucie pas particulièrement de BackgroundWorker. Même si les événements sont utiles, je n'ai pas besoin d'aide. Je trouve cela limitant car j'utilise beaucoup de méthodes asynchrones (Action/Func).

Comme MSDN énonce le processus avec le fond travailleur:

Pour mettre en place une opération d'arrière-plan, ajouter un gestionnaire d'événements pour l'événement. DoWork Appelez votre opération prenant beaucoup de temps dans ce gestionnaire d'événements. Pour démarrer l'opération, appelez RunWorkerAsync. Pour recevoir des notifications de mises à jour de progression , gérez l'événement ProgressChanged. Pour recevoir une notification lorsque l'opération est terminée, gérez l'événement RunWorkerCompleted.

Il semble simplement beaucoup plus simple d'utiliser System.Threading.Thread.

+0

Salut dboarman! Merci pour votre réponse et je suis d'accord avec vous! J'ai posé cette question depuis que je me suis rendu compte aujourd'hui seulement de cette classe d'aide, mais je n'ai pas compris la raison particulière pour cela. Cette classe est toujours mentionnée dans le scénario GUI en tant que classe auxiliaire. –

1

Vous pouvez utiliser le modèle de l'APM, à savoir

mySocket.BeginReceive(..., myCallBack); 

Mais ce n'est pas mon modèle préféré. J'utiliserais le ThreadPool, probablement à travers un BackgroundWorker.

+0

Merci Henk! Je me suis rendu compte que probablement je vais avoir un problème avec lui en raison du grand nombre de données reçues. –

+0

@Abruzzo, Pour la partie Threading (combien de threads) la quantité de données n'a pas d'importance. Mais le nombre de prises (connexions) fait. –

Questions connexes