请求和垃圾收集期间的 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 或与其他语言互操作时。