1

クロスポスト: https://orchard.codeplex.com/discussions/471475

ときどき、 「インスタンスを解決できず、この LifetimeScope は既に破棄されているため、ネストされたライフタイムを作成できません。」一部のコンテンツ アイテムを照会する場合。

これは、アイテムを構築する私の関数です:

        protected IEnumerable<ContentItem> GetResources(string[] productFilters, string[] topicFilters, string[] techLevelFilters)
        {                  
            var cacheKey = BuildCacheKey(productFilters, topicFilters, techLevelFilters);
            var resourceItems = ContentManager.Query().ForType("Resource").ForVersion(VersionOptions.Published).List();

            if (productFilters != null && productFilters.Any())
            {
                resourceItems = resourceItems.Where(r => productFilters.Contains(GetTaxonomyFieldValue(r, productTaxonomy)));
            }

            if (topicFilters != null && topicFilters.Any())
            {
                resourceItems = resourceItems.Where(r => topicFilters.Contains(GetTaxonomyFieldValue(r, topicTaxonomy)));
            }

            if (techLevelFilters != null && techLevelFilters.Any())
            {
                resourceItems = resourceItems.Where(r => techLevelFilters.Contains(GetTaxonomyFieldValue(r, techLevelTaxonomy)));
            }

            return _cacheManager.Get(cacheKey, ctx =>
            {
                ctx.Monitor(_clock.When(TimeSpan.FromMinutes(CacheTime)));
                return resourceItems;
            });
        }

これは、上記の関数を呼び出す関数の一部であり、エラーが表示されることがあります。

            string[] newProductFilters = GetProductFilters(0);
            if (newProductFilters != null && newProductFilters.Any())
            {
                productFilters = productFilters.Concat(newProductFilters).ToArray();
            }     

            var resourceItems = GetResources(productFilters, topicFilters, techLevelFilters);

それは散発的に発生し、問題の原因を実際に見つけることができません。アドバイスや情報をいただければ幸いです。ありがとう!

4

1 に答える 1

3

私の推測では、resourceItems変数はまだ_cacheManager.Getラムダから参照される LINQ 列挙可能です。そのラムダが実際に実行されると、それが参照するオブジェクトはすでに破棄されているのではないかと思います。列挙型をラムダで参照する前に実行することをお勧めします。何かのようなもの:

var finalResourceItems = resourceItems.ToList();

return _cacheManager.Get(cacheKey, ctx =>
{
    ctx.Monitor(_clock.When(TimeSpan.FromMinutes(CacheTime)));
    return finalResourceItems;
});
于 2013-11-29T10:10:36.090 に答える