请求和垃圾回收期间的 WCF 异步

本文关键字:WCF 异步 回收期 求和 请求 | 更新日期: 2023-09-27 17:55:33

我有一个自托管的 WCF 服务。它提供了一个处理函数DoSth()。

处理可能需要很长时间,所以我需要事先将 OK 返回给调用方以完成任务。目前我已经通过调用来实现这一点

Task.Factory.StartNew(() => DoWork());

垃圾回收器是否有可能干扰,以便刚刚创建的任务可能永远不会完成?

如果程序是自托管的,我会说只要它不会干扰当主机运行时(静态变量也保持其值)。如果我错了,请纠正我。

但是,如果服务托管在 IIS 中,垃圾回收将如何反应?如果它干扰了,有没有办法防止它?

请求和垃圾回收期间的 WCF 异步

GC 永远不会收集将来可能被可执行代码访问的对象(至少通过任何托管引用)。 这就是它的设计方式。

如果执行某些代码可以使用该对象,则不允许 GC 清理它。 它只清理它可以证明永远不会再被任何可执行代码访问的对象。

由于此任务、赋予委托以及委托中使用的对象都可以由将处理此请求的线程访问,因此它们都是可访问的,并且不符合收集条件。

基本上,您唯一需要考虑以下问题的情况是,"我尝试使用的对象是否可能在我完成之前被 GC 清理干净"是当您处理非托管引用时,例如在使用 WeakReference 类或与其他语言互操作时。