5

ASP.NETページのライフサイクルが完了する直前にスレッドをスピンオフして実行時間の長いプロセスを実行するとどうなりますか?ASP.NETランタイムはスレッドを強制終了しますか?これは未定義の動作につながる可能性がありますか?

これは、Page_Loadイベントでバックグラウンドスレッドを回転させるコードのサンプルです。これは安全なことですか?

protected void Page_Load(object sender, EventArgs e)
{
    Thread newThread = new Thread(new ThreadStart(SomeLongRunningMethod));
    newThread.IsBackground = true;
    newThread.Start();
}

private void SomeLongRunningMethod()
{
    // some long running process goes here...
}
4

4 に答える 4

1

ユーザーが Web フォームにアップロードした動画に対して、ffmpeg を使用していくつかの動画変換/処理を行ったところ、スレッドが完了するまでに数時間かかったとしても、完全に機能しました。スレッドのステータスを見つけるのは難しいため、ログとエラー処理が非常に重要であることを覚えておくことが非常に重要です。

于 2009-02-02T08:59:44.360 に答える
1

別のスレッドで時間のかかるロギングを行う同じタイプのコードをいくつか実験しました。うまくいくようですが、本番環境ではテストしていません。

あなたのコードと私のコードの唯一の違いは、新しいスレッドを設定する代わりにスレッド プールを使用したことです。

おそらく、リクエストデータやその他のページ情報のコピーを作成して、それらが破棄されないようにするでしょうが、それを除けば、これはうまくいくはずです。

于 2009-02-02T08:42:10.307 に答える
1

同僚が最近、一部のデータ エクスポートでこれを行いました。クライアントはコントロール パネル (Web ベース) にログインし、いくつかのボタンを押したり、その他のボタンを押したりすると、ファイルが神秘的なサーバーに FTP 送信されます。

フロントエンドはASP AJAXを使用して行われ、@bangが言うように、スレッドはうまく実行されますが、追跡するのは絶対に面倒です。

UI のプログレス バーとステータス ラインを更新するために AJAX が使用されました。しかし、実際のデータセット (数百万行) で作業を開始するとすぐに、UI 全体でタイムアウト エラーが発生し続けました。この時点で、バックグラウンド スレッドとの接触が失われます...

まだ実行されていますか?輸出は終わりましたか?ページを更新してもう一度ボタンを押すとどうなりますか? フルフィルメント ハウスは 2 つの製品を人々に送りますか?

ちょっとした悪夢です。彼は現在、必要なエクスポートの詳細を含むジョブ テーブルに接続された Windows タスク スケジューラでスケジュールされたコンソール アプリとして実行するように書き直しています。

これが少しばかげていると思われる場合は、実行時間の長いプロセスを少しのソケット サーバーで記述し、aspx コード ビハインドをそれと通信させることができます。

于 2009-02-02T17:52:41.273 に答える
0

IIS ワーカーのリサイクル設定に注意してください。これは、開始された後でもスレッドに影響を与える可能性があるためです。必ず例外をキャッチしてログに記録してください。

于 2009-02-02T08:43:52.050 に答える