我有这段简单的代码:
public void Run()
{
var invokerThread = new Thread(new ThreadStart(RunOnBackground));
invokerThread.Start();
}
private void RunOnBackground()
{
Trace.WriteLine("hi");
...
}
很不幸,当运行这段代码(来自第三方进程)时,线程并没有真正运行。
在进程资源管理器和VS调试器中,我看到线程被创建并且状态为“Running”。
主线程的公寓是STA,我已经尝试了内部线程的STA和MTA两种方式。
当我在Run()
方法的末尾添加invokerThread.Join();
时,线程确实运行。但是这并没有真正帮助。
我错过了什么?
编辑:以下是有关代码托管的更多信息 -
Run()
方法通过COM互操作从进程中调用,该进程也是托管可执行程序集(使用COM互操作的原因是系统中的所有其他组件都是本地的)。
RunOnBackground()
方法在跟踪之后包含一些更多的代码,通常其执行时间为10-20秒,包括启动另一个进程并等待其终止。此外,在代码中我还有一些其他区域,其中我写一些调试信息到Trace中。在调试代码时,Run()
像平常一样运行,在invokerThread.Start();
之后,invokerThread的状态为“Running”(尽管RunOnBackground()
方法内的断点不会停止)。
当我在Run()
方法的末尾添加invokerThread.Join()
时,调试器在Join()
之后进入RunOnBackground()
。