【问题标题】:ASP.NET Cache - long running operationASP.NET 缓存 - 长时间运行的操作
【发布时间】:2016-05-18 18:38:14
【问题描述】:

我将数据存储在缓存中,以免经常访问数据库(数据是否有点陈旧也没关系),数据集不是特别大,但由于操作的复杂性,操作可能需要一些时间查询(很多连接和子查询)。我有一个静态助手类,数据用于绑定单个页面。页面这样称呼它:

public static List<MyList> MyDataListCache
        {
            get
            {
                var myList = HttpContext.Current.Cache["myList"];

                if (myList == null)
                {


                    var result = MyLongRunningOperation();

                        HttpContext.Current.Cache.Add("myList", result, null, DateTime.Now.AddMinutes(3),
                            Cache.NoSlidingExpiration, CacheItemPriority.Normal, null);



                        return result;
                    }
                }
                else
                {
                    return (List<MyList>)myList;
                }
            }
        }

这很好用,除非当项目超出缓存时很多人同时点击该页面。数百个 LongRunningOperations 启动并导致应用程序崩溃。我该如何避免这个问题?如果任务当前正在运行,我已经尝试使用异步任务订阅,但没有让它工作。

【问题讨论】:

    标签: c# asp.net caching


    【解决方案1】:

    启动此服务后,您应该立即调用 LongRunningOperation() 来预热缓存。

    其次,您总是希望返回一些东西,所以我会考虑在缓存到期之前刷新此缓存的后台任务。

    做这两件事将使您描述的情况无效。缓存将由后台工作人员刷新,因此每个人都很高兴:)

    【讨论】:

    • 感谢关于应用启动的预取想法,我一定会实现的。如何在 ASP 中实现后台任务?我习惯于在 winforms 中与后台工作人员一起工作。此外,这会保持应用程序始终处于活动状态,还是会在用户不活动后仍然关闭工作池进程?
    • 不客气 :) Scott Hanselman 的博客上有一些关于 asp.net 后台工作人员的好技巧:hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx -
    • HttpContext.Cache 对后台线程不可用。你可以改用HttpRuntime.Cache 吗?
    • 谢谢,Hanselman 博客上的示例似乎有点矫枉过正,所以我实现了一个计时器控件,可以从 global.asax 更新缓存,它似乎工作得很好:)
    猜你喜欢
    • 2011-01-10
    • 2019-08-03
    • 1970-01-01
    • 2012-04-03
    • 1970-01-01
    • 1970-01-01
    • 2011-11-30
    • 2018-04-28
    • 1970-01-01
    相关资源
    最近更新 更多