2011-02-03 10 views
0

私はタスクの実行時間を制限する様々な方法があることを知っています。以前に使用したメソッドの欠落や変更/改善があるかどうかは疑問でした。どのようにタスクが.Netで実行される時間を制限できますか?

方法論がどのくらい正確に機能しているかわからないところで、私はそれに質問を入れました。

既存の方法は、私は必ずしも自分自身を使用していないがを知っている:それは、その後一定時間を終了スレッドを殺すためにため

  1. は、世論調査をThreadを作成します。この解決策は、ThreadAbortExceptionが多少厄介であり、あなたが覚えていれば、コードがどこで終了するか保証されないということを覚えていれば、それは素晴らしいことではありません。
  2. IAsyncResultパターン、この問題は、一定の時間待つことができますが、リクエストを中止するように通知する簡単な方法はありませんので、チェックされているブールフラグ(または同様のもの)を設定する必要があります非同期コードの内部で停止し、停止させます。ここで問題となるのは、非同期コードがコードの特定のセクションに詰まっている場合、非同期コードが実際に終了する前にしばらくの間実行される可能性があるということです。
  3. 私はしばしば非同期のもののためにBackgroundWorkerを推奨していますが、これをASP.Netの下で使用することはできますか(私はそう思うでしょう)、それは特定の時間の後に非同期プロセスを終了する簡単な方法を持っていますか?
  4. .Net 4.0のタスクAPIを使用します(現在のところ、私の仕事は.Net 3.5に制限されていますので、私にとってはオプションではありません)。 MSDNのドキュメントを読むと、CancellationTokenを使用してタスクを簡単に取り消すことができますが、取り消しがどれほど迅速に行われ、finallyブロックが確実に呼び出されるようになります。

全ての溶液/提案/方法論は、4から

答えて

1

最も安全なキャンセル方法は常に協力的です。

ThreadAbortExceptionを介して)スレッドを決して殺すことは絶対に勧められません。あなたが絶対に選択肢がなければ、そのコードを別のプロセスにしてください。これはきれいに殺すことができます。 AppDomainsは素晴らしいアイデアでしたが、実際の世界に耐えられません。

IAsyncResult,BackgroundWorkerおよびCancellationTokenはすべて協調解除の形態である。だから、彼らは非常にきれいで(資源を失うことなく、finallyブロックを呼んでいます...)、しかし、彼らは "不正な"コードを扱うことができないという欠点があります。

バックグラウンドタスクコードを作成する場合は、BackgroundWorkerまたはCancellationTokenを使用してください。可能であれば "不正な"コードで作業する必要がある場合は、別のプロセスでラップしてください。

BackgroundWorkerはASP.NETで正常に動作し、それはsupports cooperative cancellationです。

1

キャンセルトークンを歓迎し、2からブーリアンフラグが機構の同じ種類です。どちらの場合も、タスクは協調してフラグを定期的にチェックする必要があります。 4の利点は、自分で作成するのではなく、標準化されたフラグがあることです。

スレッドを中止するのは悪いですが、コードが慎重に書かれていれば管理しやすくなります。特に、グローバルな状態を破損するのは簡単です。

スレッドを中止する安全版は、別のapp-domainでスレッドを実行しています。次に、スレッドが終了したらapp-domainをアンロードします。すべての管理されていないリソースに正しいクリティカルファイナライザがある場合、SafeHandlesを使用すると安全に動作します。

関連する問題