.NET线程问题

Mus*_*sis 6 .net c# multithreading

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

ThreadStart starter = new ThreadStart(SomeMethod);
starter.Invoke();
Run Code Online (Sandbox Code Playgroud)

还有这个?

ThreadStart starter = new ThreadStart(SomeMethod);
Thread th = new Thread(starter);
th.Start();
Run Code Online (Sandbox Code Playgroud)

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

SLa*_*aks 13

他们不一样.

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

调用new Thread(SomeMethod).Start()将创建一个新线程(具有自己的堆栈),在线程上运行该方法,然后销毁该线程.

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

调用BeginInvoke(您也没有提及)也将在后台运行该方法的线程池,并将保留有关方法结果的信息,直到您调用EndInvoke.(打电话后BeginInvoke,你必须打电话EndInvoke)

一般来说,最好的选择是ThreadPool.QueueUserWorkItem.