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
.
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. –
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 :) –