Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net MVC解决方案中的默认值_Asp.net_Asp.net Mvc_Caching_Memorycache - Fatal编程技术网

Asp.net MVC解决方案中的默认值

Asp.net MVC解决方案中的默认值,asp.net,asp.net-mvc,caching,memorycache,Asp.net,Asp.net Mvc,Caching,Memorycache,我很难实现这个线程中提到的处理缓存问题的解决方法 我最近的一次尝试是使用以下代码在using语句中获取一个实例(按照建议进行包装),以禁止释放缓存: private static CacheDl _instance; public static CacheDl Instance { get { if (_instance == null) { using (ExecutionContext.SuppressFlow())

我很难实现这个线程中提到的处理缓存问题的解决方法

我最近的一次尝试是使用以下代码在using语句中获取一个实例(按照建议进行包装),以禁止释放缓存:

private static CacheDl _instance;
public static CacheDl Instance
{
    get
    {
        if (_instance == null)
        {
            using (ExecutionContext.SuppressFlow())
            {
                _instance = new CacheDl();
            }
        }

        return _instance;
    }
}

private static ObjectCache Cache { get { return MemoryCache.Default; } }
这当然行不通。。我也尝试过用类似的东西包装缓存“getter”,但仍然没有达成协议

我还尝试指定一个大的pollingInterval来完全抑制这种行为,但仍然没有成功

private ObjectCache _cache;
private ObjectCache Cache
{
    get
    {
        using (ExecutionContext.SuppressFlow())
        {
            return _cache ?? (_cache = new MemoryCache("my-cache", new NameValueCollection { { "pollingInterval", "30:00:00" } }));
        }
    }
}
你猜对了,运气不好。任何帮助都将不胜感激

顺便说一句,我已经向微软申请了上述补丁包,但在提交申请4小时后还没有收到任何回复

老实说,我真的希望这将被卷进一个正式的Windows更新,这样我们就不必到处乱动,让它在非.NET4.5系统上工作

更新:
具体来说,我想知道我打算如何实施建议的变通方法。有人能举个例子说明这是如何实现的吗?

我正在解决这个问题。在我的例子中,问题似乎是缓存在AppDomain的UnhandledException事件上被释放。请参阅MemoryCache的源代码片段

正如你所看到的,它自行处理。我的解决方案是将缓存访问封装在一个类中,该类可以订阅此事件,并在旧缓存被释放时初始化新缓存。这个解决方案对我来说似乎很有效,但它确实让我觉得有些笨拙

在UnhandledException事件中,缓存仍将意外清除,但至少通过这种方式,您可以使用新缓存重新开始

public class MyCacheWrapper
{
    private MemoryCache cache;
    public MyCacheWrapper()
    {
        cache = new MemoryCache("settings");
        AppDomain.CurrentDomain.UnhandledException += (sender, args) =>
            {
                if(args.IsTerminating)
                    cache = new MemoryCache("settings");
            };
    }
}

还请注意,当您希望清除缓存时,也可以使用该类来处置和重新创建缓存,因为MemoryCache的Trim()方法无法正常工作。

最后使用配置设置对此进行了排序,以将缓存轮询间隔延长到足以使应用程序池在达到间隔之前进行循环。在构建缓存实例时,曾尝试在代码中执行此操作,但没有成功

关于相关连接问题的评论提到,如果你可以控制你的应用程序池,这是可行的黑客行为,而另一个评论在social.msdn论坛上提到了这一点

将轮询间隔增加30小时的配置设置:

<system.runtime.caching>
    <memoryCache>
        <namedCaches>
            <add name="Default"
                cacheMemoryLimitMegabytes="0"
                physicalMemoryLimitPercentage="0"
                pollingInterval="30:00:00" />
        </namedCaches>
    </memoryCache>
</system.runtime.caching>


感谢您的回答,我最终使用了长轮询配置设置,避免了缓存的内部处理。我曾尝试在代码中应用该设置,但无论出于何种原因,该设置都不起作用,但在配置中设置值解决了该问题,而且我已经有一周没有“处理”缓存问题了。谢谢,后来我发现,我被处置的原因首先是因为我的开发环境中的配置不正确,但由于这一点和其他问题,再加上为了安全起见,以防其他错误导致处置,我最终将其改为使用System.Web.Caching.Cache。