Windows FormはInvokeという仕組みが使えるが、ConsoleアプリやWindows ServiceなどではInvokeが使えない。
Windows FormではInvokeRequiredで確認してInvokeを使うことで、メソッドを実行するスレッドを1つに絞ることができる。具体的にはメインのUIスレッドでの実行に限定できる。
コンソールアプリケーションやWindowsサービスアプリケーションではInvokeはないInvokeの仕組みはUIのメッセージ処理のループに依存しているためである。通常GUIがない場合には、ブロックしていてもよいとされるためそのような仕様になっている。
時々ある仕様で、今使っている装置との通信機能を提供するDLLではスレッドも見ているようで、スレッドごとにオープンを実行しないと装置の制御を実行できない。
実行スレッドを固定したい処理がある場合には、処理したいスレッドをAutoResetEvent.WaitOneなどで止めておき、AutoResetEvent.Setで動作させ処理が終わるタイミングは別のAutoResetEventで伝えるなどという処理を組み合わせて実装しないといけない。(ようだ)