请求和垃圾收集期间的 WCF 异步
WCF async during request and garbage collection
我有一个自托管的 WCF 服务。它提供了一个处理函数DoSth()。
处理过程可能需要很长时间,因此我需要先 return 向来电者确认
完成任务。目前我已经通过调用
实现了它
Task.Factory.StartNew(() => DoWork());
是否有可能是垃圾收集器的干扰导致刚创建的任务永远无法完成?
如果程序是自托管的,我会说只要不干扰
因为主机是 运行(静态变量也保持它们的值)。
如有不妥请指正
但是,如果服务托管在 IIS 中,垃圾回收将如何反应?
如果它干扰了,有没有办法阻止它?
GC 永远不会收集将来可能被可执行代码访问的对象(至少通过任何托管引用)。这就是它的设计方式。
如果有任何可能的方式执行某些代码会使用该对象,则不允许 GC 清理它。它只清理它可以证明永远不会被任何可执行代码再次访问的对象。
因为这个任务,它被赋予的委托,以及委托中使用的对象都可以被将处理这个请求的线程访问,它们都是可访问的,并且不符合收集条件。
基本上,您甚至需要 考虑 "is the object I'm trying to use potentially going to end up cleaned up by the GC before I'm done with it" 的问题的唯一时间是当您处理非托管引用时,例如使用WeakReference
class 或与其他语言互操作时。
我有一个自托管的 WCF 服务。它提供了一个处理函数DoSth()。
处理过程可能需要很长时间,因此我需要先 return 向来电者确认 完成任务。目前我已经通过调用
实现了它Task.Factory.StartNew(() => DoWork());
是否有可能是垃圾收集器的干扰导致刚创建的任务永远无法完成?
如果程序是自托管的,我会说只要不干扰 因为主机是 运行(静态变量也保持它们的值)。 如有不妥请指正
但是,如果服务托管在 IIS 中,垃圾回收将如何反应? 如果它干扰了,有没有办法阻止它?
GC 永远不会收集将来可能被可执行代码访问的对象(至少通过任何托管引用)。这就是它的设计方式。
如果有任何可能的方式执行某些代码会使用该对象,则不允许 GC 清理它。它只清理它可以证明永远不会被任何可执行代码再次访问的对象。
因为这个任务,它被赋予的委托,以及委托中使用的对象都可以被将处理这个请求的线程访问,它们都是可访问的,并且不符合收集条件。
基本上,您甚至需要 考虑 "is the object I'm trying to use potentially going to end up cleaned up by the GC before I'm done with it" 的问题的唯一时间是当您处理非托管引用时,例如使用WeakReference
class 或与其他语言互操作时。