質問

次のコードを想定します:

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メソッド。参加は   戻らないブロッキング呼び出し   スレッドが実際に停止するまで   実行中。

テストのように聞こえますが...

Q:または、代わりに、処分を引き起こさないusingブロックを終了する方法はありますか?

A:なし。

詳細については、次を参照してください: C#" Using"構文

Response.Redirectはサーバー側の実行を終了します。

通常の実行過程では、using-blockを終了するとオブジェクトの破棄がトリガーされます。この規則の例外が発生する場合があります。プロセスがシャットダウンされたとき、コンピューターがシャットダウンされたとき、スレッドが中止されたときなど。ただし、通常の実行過程ではありません。

Server.Transferを調べます。目標の達成に役立つ場合があります。

すべてのusingステートメントはスコープベースです。そのため、どのように関数を終了しても、その時点でスタックベースだった全員が使用からクリーンアップされます。例外、返品など

何らかの理由で望んだとしても発砲を防ぐ方法はわかりません。

使用せずにusingブロックを終了する理由は何ですか?それはusingブロックのアイデアではありません。

必要に応じて使用しないでください。ただし、お勧めしません。

問題点:

  

using(SqlCommand comm = new SqlCommand(...))
  {
   ...
   if(条件)
   {

     
    

//これは真実であると判断したため、これ以上使用する必要はありません
       //廃棄コード

  
     

break;
     //または続行;それがよければ
   }
   //" if"の場合に実行されるコード真実ではない。
  }

     

Response.Redirect(page);"

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top