2010-03-15 4 views
6

Y at-il une différence essentielle entre ce code:filetage .NET question

ThreadStart starter = new ThreadStart(SomeMethod); 
starter.Invoke(); 

et cela? Ou est-ce que le premier appelle la méthode sur le thread en cours alors que le second l'invoque sur un nouveau thread?

+3

Vous ne demandez pas vraiment une question connexe de filetage. Le cœur de votre question est: «Que fait la méthode Delegate.Invoke? Répondez à cela et vous aurez votre réponse. –

+0

Dans tous les cas, si vous avez accès, vous devez oublier l'API de discussion et aller pour les tâches que l'on :) –

Répondre

13

Ils ne sont pas les mêmes.

Appel new ThreadStart(SomeMethod).Invoke() exécutera la méthode sur le thread courant en utilisant la liaison tardive. Cela est beaucoup plus lent que new ThreadStart(SomeMethod)(), qui est à son tour un peu plus lent que SomeMethod().

Appel new Thread(SomeMethod).Start() va créer un nouveau thread (avec sa propre pile), exécutez la méthode sur le fil, puis détruire le fil. L'appel ThreadPool.QueueUserWorkItem(delegate { SomeMethod(); }) (que vous n'avez pas mentionné) exécutera la méthode en arrière-plan sur le pool de threads, qui est un ensemble de threads gérés automatiquement par .Net sur lequel vous pouvez exécuter du code. Utiliser le ThreadPool est beaucoup moins cher que de créer un nouveau thread. L'appel BeginInvoke (que vous n'avez pas mentionné) exécutera également la méthode en arrière-plan sur le pool de threads et conservera des informations sur le résultat de la méthode jusqu'à ce que vous appeliez EndInvoke. (Après avoir appelé BeginInvoke, vous doit appel EndInvoke)

En général, la meilleure option est ThreadPool.QueueUserWorkItem.

+0

Pourquoi ce downvoted? – SLaks

+1

Il n'est pas vraiment valable de dire que l'une des options est meilleure que les autres. Ils font des choses différentes. ThreadPool threads sont pour les éléments de travail finis à haut chiffre d'affaires. Les nouveaux threads sont quand vous voulez un nouveau thread. (Cependant, je n'étais pas l'électeur) –

+1

+1 de ma part. Explication géniale. –

3

Dans la réponse de SLaks de cas n'est pas tout à fait clair:

ne la première invoquez la méthode sur le thread courant tandis que le second, il invoque sur un nouveau thread?

Oui.

+3

Je pensais que c'était clair. – SLaks

+0

Parfois, trop d'informations sont accablantes, alors j'ai donné l'option d'une réponse directe à sa question. J'ai upvoted votre réponse btw. – Foole