5

今日、意味のわからない奇妙な問題に遭遇しました。要約は次のとおりです。

メソッド内で、次のようにキャッシュされたアイテムを確認します。

private async Task<RatesStatus> getRatesStatusAsync() {

    //...

    if (_currentHttpContext != null) {

        //Here, I am checking for a Cached item
        var cachedRatesStatusObj = HttpContext.Current.Cache[Constants.RATESSTATUS_CACHE_KEY_NAME];
        if (cachedRatesStatusObj != null)
            return (RatesStatus)cachedRatesStatusObj;
    }

    //...

    cacheRatesStatusObject(ratesStatus);

    //...
}

ここではHttpContext.Current、ASP.NET アプリケーション内で予想されるように null ではありません。次に、cacheRatesStatusObjectメソッド内で、次のようHttpContext.Currentに null かどうかを確認します。

private void cacheRatesStatusObject(RatesStatus ratesStatus) {

    //...

    //Seeing if HttpContext.Current is null or not first.
    //and it is null here...
    if (HttpContext.Current == null)
        return;

    //...
}

そして、そこは null です。ここで何が起こっているのかわかりません。何かご意見は?

4

3 に答える 3

4

async/await を使用すると、リクエストを処理するスレッドはリクエストを未完了としてマークし、ASP.NET thread pool. awaitable が後で完了すると、残りのメソッドを実行するために別のスレッドが割り当てられますが、HttpContext はスレッド間で移行されないため、await メソッドを呼び出すときに null 参照が取得されます。

次のように、HttpContext の参照を await メソッドに渡すことができます。

await cacheRatesStatusObject(HttpContext.Current,  ratesStatus);

ただし、同時実行性と競合状態の処理には十分注意する必要があります。たとえば、待機スレッドがリソースをロックし、別のリクエスト スレッドがそれを使用しようとすると、スレッド プールが急増します。ほとんどの人は、スレッド間で HttpContext の参照を渡す代わりに、新しいオブジェクトを作成し、それらをパラメーター化されたスレッドに渡すことでこれを解決します。

于 2012-06-02T19:48:57.370 に答える
1

インスタンスを渡すのは面倒です。

代わりに、.NET 4 の MemoryCache クラスを使用してください。

http://stevescodingblog.co.uk/net4-caching-with-mvc/

于 2013-02-13T20:29:52.107 に答える
0

それ自体は null になりません。

HttpContext「スレッド静的」方法でのみ保存されます。

他の回答で示唆されているように、インスタンスを渡すだけです。

于 2012-06-02T19:52:37.337 に答える