如何使用GC.KeepAlive()以及用于什么目的?

如何使用GC.KeepAlive()以及用于什么目的?

我使用Socket将文件从终端(Windows-CE)传输到服务器。 需要传输的时间是8分钟。在Windows-CE关闭后5分钟(如果没有按下触摸屏)

如果我GC.KeepAlive()使用GC.KeepAlive() ,这是我的问题吗?

你很少需要使用GC.KeepAlive – 很少。 例如,如果你想要防止终结器的副作用发生得太早,你就可以使用它。 我经常看到它用于Mutex – 保持互斥锁活着直到应用程序结束,以确保只有一个实例。 (这里的using声明实际上更好,但这是另一回事。)

不,它听起来并不像你的情况。

从.NET的MSDN库:

KeepAlive方法的目的是确保存在对可能被垃圾收集器过早回收的对象的引用。 可能发生这种情况的常见情况是,在托管代码或数据中没有对象的引用,但该对象仍在非托管代码(如Win32 API,非托管DLL或使用COM的方法)中使用。

所以这不会解决你的问题。 事实上它甚至与你的问题无关。 您唯一能做的就是在Windows CE上运行的服务/应用程序中添加代码,只要传输正在进行,就会阻止系统关闭

屏幕断电是设备上的电源管理设置。 无论任何应用程序是否正在运行,都会发生这种情况。 GC与此完全无关。

如果您想阻止电源设备将其置于低功耗状态,您可以选择一些选项。 您可以在应用中定期调用SystemIdleTimerReset 。

您可以使用SetSystemPowerState将电源状态强制为您喜欢的状态。

您可以通过调整[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Power\Timeouts] (后面是WM_SETTINGS_CHANGE广播IIRC)的设置,将电源管理器超时更改为您喜欢的更多内容。

最佳“解决方案”取决于您的应用程序要求,用户要求和目标设备的电源管理系统。