私はTaskCreationOptions.LongRunningを使用して、並行キューから要求を読み取り、さまざまな処理を実行するバックグラウンドプロセス用のタスクを作成しました。TaskCreationOptions.LongRunningを使用して作成されたスレッドの数
task = Task.Factory.StartNew(x => PerformAction(), CancellationTokenObject, TaskCreationOptions.LongRunning);
私の理解では、これは「PerformActionを()」を呼び出すために別のスレッドを作成するかもしれないということですが、私はこれをプロファイリングするときには、 「System.Threading.ThreadHelper.ThreadStart」方法は、何度も呼び出されていることを示しています。
"System.Threading.ThreadHelper.ThreadStart"が呼び出されるたびに、新しいスレッドが作成されますか?その場合、TaskCreationOptions.LongRunningのために複数のスレッドが作成されるのは本当に奇妙です。
ThreadHelper.ThreadStartを何度も呼び出さないでください。私はそれがスレッドを作成しないヘルパーメソッドだと思うが、あなたが言及したように、それはExecutionContextフローのために使用され、何度もそれを呼び出すことは問題ではないと思います。これは私たちが心配すべき内部実装の詳細です。//referencesource.microsoft.com/#mscorlib/system/threading/thread.cs,3deeb67a9c82bbf6 このメソッドが呼び出されていることを明確に示すNewRelicのThreadExecutionログがあります長時間実行されるタスクが実行されるたびに実行されます。 – tangokhi
@tangokhi "このメソッドは、長時間実行されるタスクが実行されるたびに呼び出されます。あなたが言ったことは、あなたが単一の「タスク」を作成しても、このメソッドが何度も呼び出されたと信じていると思っていました。 – svick
私はあなたの記事から理解しているように、長時間実行されるタスクが実行されるたびにThreadHelper.ThreadStartを呼び出すべきではないと述べました。しかし、私が観察したのは、長時間実行されているタスクの場合、「1つのバックグラウンドスレッドが作成されます」が、そのバックグラウンドスレッドは実行するたびにThreadHelper.ThreadStartメソッドを呼び出します。先ほど触れたように、新しい遺物からスレッドプロファイラのログを見て、コードを読んでアイデアを得ようとしました。私はこれを誤解していると思いますか? – tangokhi