如何在新线程中强制执行

时间:2010-10-27 14:52:51

标签: c# .net multithreading

我的应用程序中有这样的代码:

var t = new Thread(new ThreadStart(new Action(SomeClass.SomeMethod)));
t.Start();
...
t.Join();

但据我所知,编译器会进行一些优化并在同一个线程中运行SomeMethod 作为主要代码。我通过在t和Thread.CurrentThread中设置线程的不同名称来检查这一点。我如何创建和运行线程以确保它是新的线程。

4 个答案:

答案 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
             });