c# - .NET 线程问题

标签 c# .net multithreading

这段代码有什么本质区别吗:

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

还有这个?

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

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

最佳答案

它们不一样。

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

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

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

调用 BeginInvoke(您也没有提到)也会在线程池的后台运行该方法,并将保留有关该方法结果的信息,直到您调用 结束调用。 (在调用 BeginInvoke 之后,您必须调用 EndInvoke)

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

关于c# - .NET 线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2450693/

相关文章:

c# - Linq to EF guid in where 子句总是返回 null

c# - Linq to XDocument 按子集分组

c# - Autofac 解决 CQRS CommandDispatcher 中的依赖关系

.net - .NET应用程序上的WaitForDebugEvent()API

多线程 - 如何调用 Action

c# - dataGridView,MySQL 数据和动态变化的信息

c# - MVC 框架如何使用 DataAnnotations 验证代码优先 POCO?

.net - 虚拟泛型方法调用的静态分析

java - 聊天客户端 - 同时使用套接字和服务器套接字

c# - 了解 WPF Dispatcher.BeginInvoke