尽管这是在Xamarin.Mac项目中发生的,但我认为问题更多与MacOS有关,因为迹象表明是App Nap的迹象。
在我的AppDelegate.cs
文件中,我有这个:
public override void DidFinishLaunching(NSNotification notification)
{
_activity = NSProcessInfo.ProcessInfo.BeginActivity(
NSActivityOptions.Background |
NSActivityOptions.LatencyCritical,
"You charge $3,500AUD for this laptop and yet " +
"can't provide enough resources for a smooth " +
"operation of this app in the background? " +
"Eat a d#@k Apple."
);
// ...
我测试了上述内容,每隔〜1s运行以下内容:
var now = DateTime.Now;
var now_str = now.ToString("HH:mm:ss.fff");
Debug.WriteLine(now_str);
var idle_time = now - _prevTime;
if (idle_time.TotalMilliseconds > 1200)
{
Debug.WriteLine("FFSakes Apple!");
}
_prevTime = now;
await Task.Delay(1000); // yes yes, I know timers aren't precise, hence why I said '~'1s.
经过数小时的敲打,我决定运行该应用程序,将其放在后台,然后小睡一会。事实证明,我的应用程序也是如此。在我留下的1.5个小时中,它执行了以下操作:
19:23:29.040
19:23:30.041
19:56:07.176
FFSakes Apple!
19:56:08.196
19:56:09.196
...
超过半小时的延迟!
问题1:为什么?问题2:如何解决这个问题?
您没有指示您的应用程序避免打apping。正确的选项是:
标记,指示应用程序正在执行用户请求的操作。
userInitiated
:
标记,指示应用程序正在执行用户请求的操作,但系统可以在空闲时进入睡眠状态。
userInitiatedAllowingIdleSystemSleep
文档:
如果应用程序未执行用户启动的工作,例如更新屏幕上的内容,播放音乐或下载文件,则系统可能会将其置于“应用程序小睡”中。
您的应用正在使用userInitiatedAllowingIdleSystemSleep
:
标记以指示应用程序已启动某种工作,但不是用户请求的直接结果。
还有文档...
App Nap通过调节应用程序的CPU使用率和减少启动其计时器的频率。
...这可能是您看到的结果。