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

时间:2011-09-03 18:59:24

标签: c# sockets windows-ce

如何使用GC.KeepAlive()以及出于何种目的?

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

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

3 个答案:

答案 0 :(得分:13)

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

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

答案 1 :(得分:4)

来自.NET的MSDN库:

  

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

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

答案 2 :(得分:0)

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

如果您想阻止电源设备将其置于低功耗状态,您可以选择几种方式。您可以定期在应用中拨打SystemIdleTimerReset

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

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

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