Response.Redirect(“”)inside“ using {}”
-
06-07-2019 - |
質問
次のコードを想定します:
using (SqlConnection conn = new SqlConnection(connectionString))
{
...
using (SqlCommand comm = new SqlCommand(...))
{
.. do stuff ..
if(condition) Response.Redirect("somepage.aspx");
}
}
UseingブロックからのResponse.Redirect()出口により、すべての接続が破棄されますか?
または、代わりに、廃棄を引き起こさないusingブロックを終了する方法はありますか?
編集:廃棄せずに終了しません。私はそれが機能しない原因となる落とし穴を認識したいです。 -もちろん、クラッシュは回避できますが、その場合、すべてのオブジェクトが破棄されると確信しています-難しい方法です-その状況では
基本的に「わからない」という回答を受け入れました。しかし、それは非常によく研究された「わからない」
とりあえず、Response.Redirectはそれを念頭に置いてusingステートメントとコードを中止すると仮定します。 -他の方法で証明されるまで。
解決
http://msdn.microsoft.com/en-us/からlibrary / aa973248.aspx
Response.Redirectを呼び出すことはできません finallyブロックを実行します。したがって、 リダイレクトまたは転送の前 処理が発生する可能性があるため、廃棄する必要があります オブジェクトの
はい、Usingステートメントに直接対処するわけではありませんが、一般的なプログラミング方法であることに注意してください。また、その記事はSharePointについて言及していますが、SPはASP.NET 2.0上に構築されているため、依然として関連があると思います。
他のヒント
http://msdn.microsoft.com/en-us/からlibrary / aa973248.aspx および http://msdn.microsoft。 com / en-us / magazine / cc163298.aspx :
Response.Redirectを呼び出すことはできません finallyブロックを実行(そして C#などの言語固有のキーワード 「使用」ステートメント)。したがって、 リダイレクトまたは転送の前 処理が発生する可能性があるため、廃棄する必要があります オブジェクトの
ただし、 http://msdn.microsoft.comから/en-us/library/system.threading.threadabortexception.aspx :
アボートへの呼び出しが行われたとき スレッドを破壊するメソッド、共通 言語ランタイムがスローします ThreadAbortException。 ThreadAbortExceptionは特別です キャッチできる例外ですが、それは で自動的に再び発生します catchブロックの終わり。 これが 例外が発生し、ランタイム すべてのfinallyブロックを前に実行します スレッドの終了。スレッド以来 で無制限の計算を行うことができます 最後にブロックするか、呼び出す Thread .. ::。ResetAbortはキャンセルします 中止、という保証はありません スレッドは終了します。あなたがしたい場合は 中止されたスレッドが持つまで待つ 終了、あなたは電話することができます Thread .. ::。Joinメソッド。参加は 戻らないブロッキング呼び出し スレッドが実際に停止するまで 実行中。
テストのように聞こえますが...
Response.Redirectはサーバー側の実行を終了します。
通常の実行過程では、using-blockを終了するとオブジェクトの破棄がトリガーされます。この規則の例外が発生する場合があります。プロセスがシャットダウンされたとき、コンピューターがシャットダウンされたとき、スレッドが中止されたときなど。ただし、通常の実行過程ではありません。
Server.Transferを調べます。目標の達成に役立つ場合があります。
すべてのusingステートメントはスコープベースです。そのため、どのように関数を終了しても、その時点でスタックベースだった全員が使用からクリーンアップされます。例外、返品など
何らかの理由で望んだとしても発砲を防ぐ方法はわかりません。
使用せずにusingブロックを終了する理由は何ですか?それはusingブロックのアイデアではありません。
必要に応じて使用しないでください。ただし、お勧めしません。
問題点:
using(SqlCommand comm = new SqlCommand(...))
{
...
if(条件)
{//これは真実であると判断したため、これ以上使用する必要はありません
//廃棄コードbreak;
//または続行;それがよければ
}
//" if"の場合に実行されるコード真実ではない。
}Response.Redirect(page);"
?