2016-04-07 23 views
1

私はTaskCreationOptions.LongRunningを使用して、並行キューから要求を読み取り、さまざまな処理を実行するバックグラウンドプロセス用のタスクを作成しました。TaskCreationOptions.LongRunningを使用して作成されたスレッドの数

task = Task.Factory.StartNew(x => PerformAction(), CancellationTokenObject, TaskCreationOptions.LongRunning); 

私の理解では、これは「PerformActionを()」を呼び出すために別のスレッドを作成するかもしれないということですが、私はこれをプロファイリングするときには、 「System.Threading.ThreadHelper.ThreadStart」方法は、何度も呼び出されていることを示しています。

"System.Threading.ThreadHelper.ThreadStart"が呼び出されるたびに、新しいスレッドが作成されますか?その場合、TaskCreationOptions.LongRunningのために複数のスレッドが作成されるのは本当に奇妙です。

答えて

1

正確には​​とは何も記載されていないので、それに頼るべきではありません。何the documentation言うれる(強調鉱山):

はまたに応じて、追加のスレッド

今すぐタスクのために必要となる場合がありますタスクスケジューラヒントを提供しますthe reference sourceの場合、LongRunningのデフォルトのTaskSchedulerは、単一の新しい背景Threadを開始するだけです。

ThreadHelper.ThreadStartはどこですか?これはThreadの実装の一部であり、スレッドの開始時に一度呼び出されます。 its purpose is to make sure ExecutionContext is flowedと思われます。

だから、私はあなたがデフォルトTaskSchedulerと​​とTaskFactory.StartNewThreadHelper.ThreadStart何回も呼び出しますが、それはいけない、少なくともではないという結論に到達しなかったのか分かりません。

+0

ThreadHelper.ThreadStartを何度も呼び出さないでください。私はそれがスレッドを作成しないヘルパーメソッドだと思うが、あなたが言及したように、それはExecutionContextフローのために使用され、何度もそれを呼び出すことは問題ではないと思います。これは私たちが心配すべき内部実装の詳細です。//referencesource.microsoft.com/#mscorlib/system/threading/thread.cs,3deeb67a9c82bbf6 このメソッドが呼び出されていることを明確に示すNewRelicのThreadExecutionログがあります長時間実行されるタスクが実行されるたびに実行されます。 – tangokhi

+1

@tangokhi "このメソッドは、長時間実行されるタスクが実行されるたびに呼び出されます。あなたが言ったことは、あなたが単一の「タスク」を作成しても、このメソッドが何度も呼び出されたと信じていると思っていました。 – svick

+0

私はあなたの記事から理解しているように、長時間実行されるタスクが実行されるたびにThreadHelper.ThreadStartを呼び出すべきではないと述べました。しかし、私が観察したのは、長時間実行されているタスクの場合、「1つのバックグラウンドスレッドが作成されます」が、そのバックグラウンドスレッドは実行するたびにThreadHelper.ThreadStartメソッドを呼び出します。先ほど触れたように、新しい遺物からスレッドプロファイラのログを見て、コードを読んでアイデアを得ようとしました。私はこれを誤解していると思いますか? – tangokhi

関連する問題