2012-06-28 79 views
0

我有我的服务下面的代码:终身异步委托调用的

protected override void OnStart(string[] args) 
{ 
    var cleaner = new Cleaner(); 
    Action action = cleaner.Run; 
    action.BeginInvoke(null, null); 
} 

我很担心,我是否应该委托移动到一个实例变量,因为它使用可能被GC收集的对象,因为他们只在本地创建。

+0

您是否尝试调用[GC.Collect()](http://msdn.microsoft.com/zh-cn/library/xe0c2357.aspx)以查看会发生什么? –

回答

0

如果收集到仍在使用中的物体,会发生什么情况?对这个问题没有理智的答案。因此,CLR保证没有被引用的对象将被垃圾收集。无论您如何编写代码,您都是安全的。

如果仍然引用对象,您甚至无法获取对象。即使你想。

+0

不能'action'本身收集? – Grozz

+0

它可以,如果没有人(例如调用的BeginInvoke后,甚至期间)使用它。你怀疑这会导致问题吗?它不能/不应该。 – usr

+0

所以'action'被收集,然后'cleaner'被收集。因此,仍在运行'cleaner.Run'函数的线程会留下无效数据。 – Grozz