0

.Netでタスクを実行する時間を制限する方法はいくつかあることを知っていますが、他に見逃したものや、以前に使用した方法の変更/改善があるかどうか疑問に思いました。

方法論がどのように正確に機能するかわからない場合は、質問を含めました。

私が知っている既存の方法は、必ずしも自分で使用しているわけではありません。

  1. を作成しThread、ポーリングして一定時間終了してから、スレッドを強制終了します。このソリューションは、やや厄介なものに依存しているため、優れていThreadAbortExceptionません。コードがどこで終了するかは保証されていません。つまり、管理されていないリソースが使用されたままになる可能性があります。
  2. パターンを使用しIAsyncResultます。これに伴う問題は、一定の時間待つことができるが、リクエストを中止することを通知する簡単な方法がないため、ブールフラグ(または同様のもの)の設定に依存する必要があることです。 )非同期コード内でチェックされ、停止します。ここでの問題は、非同期コードがコードの特定のセクションでスタックしている場合、実際に終了する前にしばらくの間実行し続ける可能性があることです。
  3. 私はよく人々BackgroundWorkerが非同期のものを推奨するのを見てきましたが、ASP.Netでこれを使用できますか(私はそう思います)、一定時間後に非同期プロセスを終了する簡単な方法がありますか?
  4. .Net 4.0でタスクAPIを使用します(現在、すべての作業は.Net 3.5に制限されているため、オプションではありません)。MSDNのドキュメントをざっと読むと、を使用してタスクを簡単にキャンセルできるように見えますがCancellationToken、キャンセルはどのくらいの速さで有効になり、finallyブロックが確実に呼び出されるようになりますか。

すべてのソリューション/提案/方法論を歓迎します

4

2 に答える 2

1

4 のキャンセル トークンと 2 のブール値フラグは、同じ種類のメカニズムです。どちらの場合も、タスクは協力してフラグを定期的にチェックする必要があります。4 の利点は、独自のフラグを作成するのではなく、標準化されたフラグがあることです。

スレッドの中止は悪いことですが、コードが注意深く書かれていれば対処できます。特に、グローバル状態を破損するのは簡単です。

スレッドを中止する安全なバージョンは、別のアプリ ドメインでスレッドを実行することです。次に、スレッドが強制終了されたら、アプリ ドメインをアンロードします。これは、管理されていないすべてのリソースに適切な重要なファイナライザーがあり、SafeHandles を使用している場合に安全に機能します。

于 2011-02-03T10:09:43.430 に答える
1

キャンセルの最も安全な形式は、常に協調的です。

( 経由で) スレッドを強制終了しないことをお勧めしますThreadAbortException。どうしても選択の余地がない場合は、代わりにそのコードを別のプロセスにして、完全に強制終了することができます。AppDomains は良いアイデアでしたが、現実の世界には耐えられません。

IAsyncResultBackgroundWorker、およびCancellationTokenはすべて、協調的なキャンセルの形式です。したがって、それらはすべて非常にクリーンです (リソースを失う、finallyブロックを呼び出すなど) ことはありませんが、「ローグ」コードを処理できないという欠点があります。

バックグラウンド タスク コードを記述している場合は、BackgroundWorkerまたはを使用しますCancellationToken。「悪意のある」コードで作業する必要がある場合は、別のプロセスでラップします。

BackgroundWorkerASP.NET で問題なく動作し、協調的なキャンセルをサポートしています。

于 2011-02-03T10:52:42.657 に答える