巴别塔上的雇工


OMG, My Timer is GC-ed!
3月 25, 2008, 10:50 上午
Filed under: 技术体会

今天在写Unit Test代码的时候碰到一个有意思的问题,为了模拟异步回调,我用C#写了一个MockMethod,大概像下面这个样子:

image

调用这个函数的时候指定一个callback,这个callback会在1秒钟(1000毫秒)之后由.net从ThreadPool中抽调一个线程(Thread)出来执行,看起来一切都没问题,我开始也这么想:-) 单独的Unit Test Case运行也正常,但是运行包含这个case的一个Test Suite的时候就总是失败,貌似时不时callback函数没有被调用,单独debug这个case没有问题,但是运行整个Suite又出问题,出鬼了。当然,看到这里你肯定看了标题,更本原因就是创建的Timer对象被当成Garbage给Collect掉了,运行单独的Test Case的时候,速度快,消耗内存也少,没有引发GC,所以侥幸成功,但是在运行大单Suite的时候,内存消耗多,占用的时间也长,很有可能这个Timer对象创建之后一秒钟之内就给GC掉了,自然也不会有人去调用那个callback。

解决办法就是用一个成员变量保留对这个Timer对象的引用,当然,前提是包含这个方法的对象不会被GC,如下:

image


发表评论 so far
留下评论



留下评论