我的应用程序中有这样的代码:
var t = new Thread(new ThreadStart(new Action(SomeClass.SomeMethod)));
t.Start();
...
t.Join();
但据我所知,编译器会进行一些优化并在同一个线程中运行SomeMethod 作为主要代码。我通过在t和Thread.CurrentThread中设置线程的不同名称来检查这一点。我如何创建和运行线程以确保它是新的线程。
答案 0 :(得分:5)
编译器将不以这种方式优化您的代码。代码将在新的.NET线程中运行。你观察的方式肯定是错误的。
请注意,.NET线程不一定等同于OS线程:
操作系统ThreadId与托管线程没有固定的关系,因为非托管主机可以控制托管和非托管线程之间的关系。具体来说,复杂的主机可以使用CLR Hosting API针对同一操作系统线程调度许多托管线程,或者在不同操作系统线程之间移动托管线程。
理论上,您可以看到两个具有相同Windows线程ID的托管线程,但Thread.Name
属性仍然不同(假设您最初将名称设置为两个不同的值)。
如果您可以发布您在错误的帖子中观察到某些内容时使用的代码,则可能会发现您所犯的错误。
答案 1 :(得分:1)
我认为你的代码出错了。试试这个:
Thread.CurrentThread.Name = "main";
var t = new Thread(new ThreadStart(new Action(SomeClass.SomeMethod)));
t.Name = "worker";
t.Start();
// ...
t.Join();
请注意Thread.Name是一次写入属性。因此,命名线程池线程是一个坏主意!
答案 2 :(得分:1)
据我所知,如果你告诉一个程序在一个新线程中运行一个任务,那就是将要发生的事情。这两个线程可能最终在同一个内核上运行(因为你的调用线程可能没有那么多,除非等待另一个线程完成),但你的进程中将有两个不同的内存空间和执行指针。
一种简单的方法来证明它是打开任务管理器,在SomeMethod中设置断点,在进程选项卡中检查VS(devenv.exe)的线程数,然后点击Debug按钮启动你的程序。当它到达断点时,再次检查线程数;你将有两个新线程,一个用于主程序执行流程,另一个用于工作线程。附加的调试器可能还有一个。
答案 3 :(得分:0)
为什么不使用任务库? (如果使用.NET 4.0)
Task task = Task.Factory.StartNew(() =>
{
// your code here, this will be executed in a Task thread
});