如何使用GC.KeepAlive()
以及出于何种目的?
我使用Socket将文件从终端(Windows-CE)传输到服务器。需要传输的时间是8分钟。在Windows-CE关闭后5分钟(如果没有按下触摸屏)
如果我使用GC.KeepAlive()
,这是我的问题吗?
答案 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)将电源管理器超时更改为您喜欢的更多内容。
最佳“解决方案”取决于您的应用程序要求,用户要求以及目标设备的电源管理系统。