我有一个对象,我认为它只由WeakReference持有.我已经使用SOS和SOSEX跟踪了它的参考持有者,并且都证实了这种情况(我不是SOS专家,所以我在这一点上可能是错的).
WeakReferences的标准解释是GC在进行扫描时会忽略它们.尽管如此,我的对象仍然存在于GC.Collect(GC.MaxGeneration,GCCollectionMode.Forced)的调用中.
仅使用WeakReference引用的对象是否可以在该集合中生存?是否有一个更加彻底的收藏品,我可以强迫?或者,我是否应该再次访问我的观点,即对象的唯一引用是弱的?
更新和结论
根本原因是堆栈上有一个锁定对象的引用.目前还不清楚为什么SOS和SOSEX都没有显示该参考.用户错误始终是可能的.
在诊断根本原因的过程中,我做了几个实验,证明对第二代物体的WeakReferences可以坚持很长时间.但是,WRd第二代对象将无法在GC.Collect(GC.MaxGeneration,GCCollectionMode.Forced)中存活.
我的网站页面由两种内容组成.第一个是用户之间的变量,但对于所有页面都是常量.第二个是跨用户不变的,但在页面之间是可变的.这是一种常见的布局.将输出缓存应用于此类内容的最佳方法是什么?
据我了解,Html.Substitute助手与MVC2渲染管道不兼容,消除了旧的圆环缓存方式.
特异性水平会降低输出缓存的价值.同一用户不太可能在缓存输出的生命周期内多次查看同一页面.
互联网上有几次尝试,它们修改OutputCache属性并渲染子系统以支持替换.我发现的最好的就是这里.
但是,我发现的各种片段似乎都是非正式的实现,并且得不到很好的支持.另外,我倾向于怀疑如果将替换添加回MVC2管道那么容易,那就完成了.
action方法不会使用OutputCache属性进行标记,并且会返回一个包含多个Html.RenderAction调用的视图,这些调用将独立地引入缓存的内容.除了使用稍微重量级的含义之外RenderAction,它还会增加额外的间接层和代码味道.
您在MVC2中独立编写缓存内容的经历是什么?什么运作良好,什么没有?
outputcache partial-views donut-caching renderaction asp.net-mvc-2
我在.Net中遇到了一些关于垃圾收集的奇怪行为.
以下程序将非常快速地抛出OutOfMemoryException(在32位,2GB机器上不到一秒钟之后).永远不会调用Foo终结器.
class Foo
{
Guid guid = Guid.NewGuid();
byte[] buffer = new byte[1000000];
static Random rand = new Random();
public Foo()
{
// Uncomment the following line and the program will run forever.
// rand.NextBytes(buffer);
}
~Foo()
{
// This finalizer is never called unless the rand.NextBytes
// line in the constructor is uncommented.
}
static public void Main(string args[])
{
for (; ; )
{
new Foo();
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果取消注释rand.nextBytes行,它将无限运行,并定期调用Foo终结器.这是为什么?
我最好的猜测是,在前一种情况下,CLR或Windows VMM都懒得分配物理内存.永远不会写入缓冲区,因此永远不会使用物理内存.当地址空间用完时,系统崩溃.在后一种情况下,系统在用完地址空间之前耗尽物理内存,触发GC并收集对象.
但是,这是我没有得到的部分.假设我的理论是正确的,为什么地址空间不足时GC不会触发?如果我的理论不正确,那么真正的解释是什么呢?
我正在尝试使用属性选择器和CSS来格式化元素.
HTML看起来像:
<div id="user" highlight="false">User Name</div>
Run Code Online (Sandbox Code Playgroud)
CSS是:
[highlight=true]
{
background-color: red;
}
[highlight=false]
{
background-color: white;
}
Run Code Online (Sandbox Code Playgroud)
然后是一些伴随的JavaScript:
if( foo )
{
node.setAttribute('highlight', true);
}
else
{
node.setAttribute('highlight', false);
}
Run Code Online (Sandbox Code Playgroud)
这适用于Firefox和Chrome.当JavaScript更改突出显示属性时,元素的背景颜色会根据需要更改.然而,在IE8中,这是一个不同的故事.元素将根据HTML中最初指定的突出显示值正确显示,但是当动态更改属性时,元素的显示不会更改.
这是一个众所周知的怪癖吗?有一个已知的解决方法吗?
更新 我刚刚将属性名称更改为"frob",其值为"on"和"off".这应解决有关保留或可解释值的任何问题.
还有一点需要注意.当我打开IE8开发人员工具并使用HTML检查器时,它将显示样式[frob = on]或[frob = off],因为应用于我启动文档检查器时的任何值.但是,frob属性将不再在检查器视图中更改.在初始渲染HTML之后,[frob = on/off] css中的值决不会被应用.
更新:解决问题解决 方案是强制重绘.有多种方法可以做到这一点,但似乎标准的方法是将className重新分配给自己.
我正在尝试实现一种文件存储机制,该机制在单个文件中保存大量可变大小的记录,并保证记录集始终可以恢复到一致状态,即使系统在硬件级别出现故障也是如此.
到目前为止,我已经提出了各种方案,按顺序编写数据.某些数据将附加到每条记录的末尾,以确认写入成功.但是,如果在刷新时数据不必按顺序写入磁盘,则可以在内容数据之前写入确认数据.
有两种明显的方法,但两者都是不可取的:
我在Windows(32和64位)和.Net 4.0的内存映射文件实现上使用C#
我需要遍历任意排名的数组.这适用于阅读和写作,所以GetEnumerator不起作用.
Array.SetValue(object, int)不适用于多维数组.
Array.SetValue(object, params int[])需要过多的算术来迭代多维空间.它还需要动态调用来绕过params签名的一部分.
我很想固定数组并用指针迭代它,但我找不到任何文档说多维数组保证是连续的.如果他们在维度的末尾有填充,那么这将无效.我也更愿意避免不安全的代码.
是否有一种简单的方法来仅使用单个索引顺序寻址多维数组?
clr ×2
.net ×1
arrays ×1
attributes ×1
c# ×1
css ×1
iteration ×1
javascript ×1
outputcache ×1
padding ×1
paging ×1
pinning ×1
recovery ×1
renderaction ×1
sos ×1