2016-12-21 11 views
2

私はこのトピックについていくつかの研究をしましたが、私はこれに対する期待される答えを見つけることができません。私のアプリケーションでは、私は道を次のようにWebアプリケーションでThreadPool.QueueUserWorkItemを使用する場合の欠点はありますか?

ThreadPool.QueueUserWorkItem

を使用していました。

ThreadPool.QueueUserWorkItem(o => CaseBll.SendEmailNotificationForCaseUpdate(currentCase, caseUpdate)); 

のasp.net MVC &マイアプリ私はより速く実行&迅速なユーザーの応答をユーザ操作に実行するために必要されていないすべてのバックグラウンドタスクを処理しています。 今、私はそれを知りたいと思っています。悪い面がありますか?ThreadPool.QueueUserWorkItemアプリケーションの利用者が多いとき。それは本当にあなたがやっているだろうが、一般的に言っているかに依存し

答えて

1

、あなたの可能性が懸念されます:

  • 永続。管理対象プール内のスレッドは、バックグラウンドスレッドです。アプリケーションがリサイクルするときに死ぬでしょうが、これは一般的に望ましくありません。あなたの場合、電子メールを送信したいと考えています。スレッドが実行される前に何らかの理由でプロセスが停止した場合を想像してみてください。あなたの電子メールは決して送信されません。
  • ローカルストレージは共有されているため、使用している場合は最後のスレッドからの残り物がないことを確認する必要があります。 ThreadStaticAttributeでマークされたフィールドにも適用されます。

代わりに、ジョブをどこかにスケジューリングし、実際にこのリスト(データベースなど)から読み取ってジョブを実行し、完了したものとしてマークするジョブスキームを実装することをお勧めします。そうすれば、アプリケーションをアンロードしてもメモリが再利用されることはなく、パフォーマンスを抑えることができます。必要に応じて、アプリケーション内に処理コンポーネントを実装することも、Windowsサービスとして処理コンポーネントを実装することもできます。

2

いいえ、使用しないでください。私は、理由の多くを書くことができますが、代わりに、あなたは天才私見

http://www.hanselman.com/blog/ChecklistWhatNOTToDoInASPNET.aspx

の下で、「信頼性とパフォーマンス」であるスコット・Hanslemanからこの記事をお読みください:

ファイア・アンド・フォーゲット仕事 - いつでもあなたのアプリケーションプールが消えてしまうので、ThreadPool.QueueUserWorkItemの使用を避けてください。この作業を外に出すか、必要な場合はWebBackgrounderを使用します。

推奨されているように、ThreadPool.QueueUserWorkItemを使用しないでください。

https://www.asp.net/aspnet/overview/web-development-best-practices/what-not-to-do-in-aspnet-and-what-to-do-instead#fire

編集:このための優れた代替である、具体的バックグラウンド作業を行う上で ここhttp://www.hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx

+1

はより良い、より更新されたブログ記事です:@スコット・チェンバレンで述べたように、ここではより良いリンクですASP.netで:http://www.hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx –

+0

私はあなたに「決してそれを使うべきではない」と言っていません。 Sith Lordsだけが絶対に対処します:-)このクラスを使うのが理にかなっているシナリオがあります。 – JuanR

関連する問題