1

ApplicationState に構成オブジェクトを格納する webapp を取得しました。このオブジェクトには、特にデータベースへの接続文字列が含まれています。

メールの送信やデータベースの更新など、実行時間の長いいくつかのタスクを実行するために、非同期スレッドを開始することがあります。

ただし、このスレッドには HttpContext がないため、構成オブジェクトを取得できません。

すべてが HttpContext に依存するこの設計が悪いことはわかっていますが、今変更するには遅すぎます。リフレクターを見ると、HttpContext クラスが静的内部クラスを使用して ApplicationState を取得していることがわかります。それに到達する他の方法はありますか?

.net のこれらすべての内部クラスは本当に面倒です。

4

2 に答える 2

1

スレッドを開始するときに、好きなものをスレッドに渡すだけです。ThreadStartデリゲートだけでなく、 ParameterizedThreadStartデリゲートを使用して開始します。HttpContext.Current を渡すか、スレッドに必要な情報をまとめて渡すことができます。

于 2009-03-23T10:08:24.123 に答える
0

非同期ハンドラーからアプリケーション状態 (または同様のもの) にアクセスする必要がある場合は、サブクラス(Global.asax など) を変更して、アプリケーション状態インスタンス () を静的プロパティに格納する必要があります。HttpApplicationthis.ApplicationApplication_Start

public static HttpApplicationStateWrapper State { get; private set; }

protected void Application_Start()
{
    State = new HttpApplicationStateWrapper(this.Application);
}

このインスタンスを登録するために DI フレームワークを使用する方がより適切ですが、利用可能なものがある場合は、構成を保存するためにアプリケーション状態を完全に使用することを避けることができます。さらに、.NET には、このニーズに直接対応し、どこからでも構成を読み取る機能を提供する構成フレームワークがあります。

于 2012-01-26T02:37:56.560 に答える