.NET线程问题

时间:2010-03-15 21:39:59

标签: c# .net multithreading

此代码之间是否有任何本质区别:

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

这个?

ThreadStart starter = new ThreadStart(SomeMethod);
Thread th = new Thread(starter);
th.Start();

或者第一个在当前线程上调用方法,而第二个在新线程上调用它?

2 个答案:

答案 0 :(得分:13)

它们不一样。

调用new ThreadStart(SomeMethod).Invoke()将使用后期绑定在当前线程上执行该方法。这比new ThreadStart(SomeMethod)()慢得多,SomeMethod()反过来慢于new Thread(SomeMethod).Start()

调用ThreadPool.QueueUserWorkItem(delegate { SomeMethod(); })将创建一个新线程(具有自己的堆栈),在线程上运行该方法,然后销毁该线程。

调用BeginInvoke(您没有提到)将在后台运行该方法,该方法是由.Net自动管理的一组线程,您可以在其上运行代码。使用ThreadPool比创建新线程便宜得多。

调用EndInvoke(您也没有提及)也将在后台运行该方法,并在调用BeginInvoke之前保留方法结果的相关信息。 (致电EndInvoke后,您必须致电ThreadPool.QueueUserWorkItem

一般来说,最好的选择是{{1}}。

答案 1 :(得分:3)

如果SLaks的回答不完全清楚:

  

第一个是调用当前线程上的方法,而第二个是在新线程上调用它吗?