此代码之间是否有任何本质区别:
ThreadStart starter = new ThreadStart(SomeMethod);
starter.Invoke();
这个?
ThreadStart starter = new ThreadStart(SomeMethod);
Thread th = new Thread(starter);
th.Start();
或者第一个在当前线程上调用方法,而第二个在新线程上调用它?
答案 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的回答不完全清楚:
第一个是调用当前线程上的方法,而第二个是在新线程上调用它吗?
是