尽管我指示MacOS App为什么不打apping

问题描述 投票:0回答:1

尽管这是在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:如何解决这个问题?

Repro: https://github.com/FunkyLambda/AppNapRepro

macos xamarin.mac
1个回答
0
投票

您没有指示您的应用程序避免打apping。正确的选项是:

userInitiated

标记,指示应用程序正在执行用户请求的操作

userInitiated

标记,指示应用程序正在执行用户请求的操作,但系统可以在空闲时进入睡眠状态。

userInitiatedAllowingIdleSystemSleep文档:

如果应用程序未执行用户启动的工作,例如更新屏幕上的内容,播放音乐或下载文件,则系统可能会将其置于“应用程序小睡”中。

您的应用正在使用userInitiatedAllowingIdleSystemSleep

标记以指示应用程序已启动某种工作,但不是用户请求的直接结果

还有文档...

App Nap通过调节应用程序的CPU使用率减少启动其计时器的频率

...这可能是您看到的结果。

© www.soinside.com 2019 - 2024. All rights reserved.