私はこの単純なコードを持っています:
public void Run()
{
var invokerThread = new Thread(new ThreadStart(RunOnBackground));
invokerThread.Start();
}
private void RunOnBackground()
{
Trace.WriteLine("hi");
...
}
残念ながら、このコードを(サードパーティのプロセスから)実行すると、スレッドは実際には実行されません。プロセスエクスプローラーとVSデバッガーのどちらでも、スレッドが作成され、その状態が「実行中」であることがわかります。
メインスレッドのアパートメントはSTAであり、内部スレッドでSTAとMTAの両方を試しました。
Run()
最後にメソッドに追加するとinvokerThread.Join();
、スレッドは実行されます。しかし、それでも実際には役に立ちません。
私は何が欠けていますか?
編集:ここにコードホスティングに関するいくつかの詳細情報があります-
Run()
メソッドは、実行可能アセンブリも管理されているプロセスからCOM相互運用機能を介して呼び出されます(COM相互運用機能が使用される理由は、システム内の他のすべてのコンポーネントがネイティブであるためです)。
このメソッドRunOnBackground()
には、トレース後にさらにいくつかのコードが含まれ、通常、別のプロセスの開始と終了の待機を含め、その実行は10〜20秒続きます。また、トレースにデバッグ情報を書き込む他の領域がコードにあります。コードのデバッグ中はRun()
、通常どおりに実行され、invokerThread.Start();
invokerThreadの状態が「実行中」になった後(RunOnBackground()
メソッド内のブレークポイントは停止しません)。
invokerThread.Join()
メソッドの最後に追加するとRun()
、デバッガーは。のRunOnBackground()
後に移動しJoin()
ます。