あなたの質問を理解するのはかなり難しいです、IMHOですが、試してみます。
私が理解していることから、あなたは次のようなことをしています:
string helloWorld = string.Empty;
if (this.Session["myObject"] == null)
{
// The object was removed from the session or the session expired.
helloWorld = this.CreateNewMyObject();
}
else
{
// Session still exists.
helloWorld = this.Session["myObject"].ToString(); // <- What if the session expired just now?
}
また
// What if the session existed here...
if (this.Session["myObject"] == null)
{
this.Session["myObject"] = this.CreateNewMyObject();
}
// ... but expired just there?
string helloWorld = this.Session["myObject"].ToString();
Session
オブジェクトはページ要求と同じスレッドによって管理されると考えました。つまり、try/catch なしで使用するよりも、オブジェクトが存在するかどうかを確認する方が安全です。
私は間違っていました:
Cache オブジェクトの場合、本質的に複数のスレッド間でアクセスされるオブジェクトを扱っているという事実に注意する必要があります
出典: ASP.NET キャッシュとセッション状態ストレージ
また、Robert Koritnik の回答を注意深く読まなかったのも間違いでした。実際、この回答は質問に明確に回答しています。
実際、ページ要求中にオブジェクトが削除される可能性があるという警告が表示されます。ただし、寿命はページ リクエストに依存するため、リクエストがセッション タイムアウトよりも長くかかる場合にのみSession
、セッション変数の削除を考慮する必要があることを意味します(Robert Koritnik による回答のセッションの処理方法を参照)。
もちろん、そのような状況は非常にまれです。しかし、あなたの場合、ページ要求が 20 分 (デフォルトのセッション タイムアウト) よりも長くかかる可能性があると確信している場合は、オブジェクトが存在するかどうかを確認した後にオブジェクトが削除される可能性があることを考慮する必要がありますが、本当に使う前に。
この状況では、明らかにセッション タイムアウトを増やすか、セッション オブジェクトにアクセスするときに try/catch を使用できます。ただし、私見ですが、ページ リクエストに数十分かかる場合は、Windows サービスなどの他の代替手段を検討して作業を行う必要があります。