4

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

using (SqlConnection conn = new SqlConnection(connectionString))
{
   ...
   using (SqlCommand comm = new SqlCommand(...))
   {
      .. do stuff ..
      if(condition) Response.Redirect("somepage.aspx");

   }
}

Response.Redirect() を使用しているブロックから終了すると、すべての接続が破棄されますか?

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

編集:処分せずに終了したくありません。機能しない原因となる落とし穴に注意してください。-- もちろん、クラッシュが発生しない限り、すべてのオブジェクトが破棄されることは確かです (難しい方法ですが)。

基本的に「わからない」という回答を受け入れましたが、「わからない」という非常によく調査された回答です。

当面は、Response.Redirect が using ステートメントとコードを中止することを念頭に置くことにします。-- そうでないことが証明されるまで。

4

7 に答える 7

6

http://msdn.microsoft.com/en-us/library/aa973248.aspxおよびhttp://msdn.microsoft.com/en-us/magazine/cc163298.aspxから:

Response.Redirect を呼び出しても、finally ブロック(および C# の「using」ステートメントなどの言語固有のキーワード) は実行されません。したがって、リダイレクトまたは処理の転送が発生する前に、オブジェクトを破棄する必要があります。

しかしhttp://msdn.microsoft.com/en-us/library/system.threading.threadabortexception.aspxから:

スレッドを破棄するために Abort メソッドが呼び出されると、共通言語ランタイムは ThreadAbortException をスローします。ThreadAbortException は、キャッチできる特別な例外ですが、catch ブロックの最後で自動的に再度発生します。この例外が発生すると、ランタイムはスレッドを終了する前にすべての finally ブロックを実行します。スレッドは finally ブロックで無制限の計算を実行したり、Thread..::.ResetAbort を呼び出してアボートをキャンセルしたりできるため、スレッドが終了するという保証はありません。中止されたスレッドが終了するまで待ちたい場合は、Thread..::.Join メソッドを呼び出すことができます。Join は、スレッドが実際に実行を停止するまで戻らないブロッキング呼び出しです。

テストが順調に進んでいるようです...

于 2008-10-09T13:42:16.637 に答える
2

Q:または、代わりに、廃棄を引き起こさない使用中のブロックを終了する方法はありますか?

A:なし。

詳細については、これを参照してください:C#「使用」構文

于 2008-10-09T13:14:27.020 に答える
2

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

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

Server.Transferを調べます。それはあなたがあなたの目標を達成するのを助けるかもしれません。

于 2008-10-09T13:18:24.827 に答える
2

http://msdn.microsoft.com/en-us/library/aa973248.aspxから

Response.Redirect を呼び出しても、finally ブロックは実行されません。したがって、処理のリダイレクトまたは転送が発生する前に、オブジェクトを破棄する必要があります。

はい、Using ステートメントに直接対処するものではありませんが、知っておくべき十分に一般的なプログラミング手法です。また、その記事は SharePoint について言及していますが、SP は ASP.NET 2.0 上に構築されているため、それでも関連性があると思います。

于 2008-10-09T13:29:43.260 に答える
0

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

なんらかの理由で発砲を防ぐ方法がわかりません。

于 2008-10-09T13:17:35.283 に答える
0

なぜ廃棄せずに使用中のブロックを終了したいのですか?それはブロックを使用するという考えではありません。

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

于 2008-10-09T13:18:25.187 に答える
0

どうしたの:

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

//これは正しいと判断したので、これ以上使用する必要はありません
//Disposal Code

壊す;
//または続行; if that's better
}
//「if」が true でない場合に実行されるコード。
}

Response.Redirect(ページ);"

?

于 2008-10-09T13:25:56.233 に答える