为什么我的MacOS应用程序在我的指示下仍在打盹

为什么我的MacOS应用程序在我的指示下仍在打盹,macos,xamarin.mac,Macos,Xamarin.mac,虽然这是在一个Xamarin.Mac项目中发生的,但我认为问题更多地与MacOS有关,因为有迹象表明AppNap 在我的AppDelegate.cs文件中,我有以下内容: public override void DidFinishLaunching(NSNotification notification) { _activity = NSProcessInfo.ProcessInfo.BeginActivity( NSActivityOption

虽然这是在一个Xamarin.Mac项目中发生的,但我认为问题更多地与MacOS有关,因为有迹象表明AppNap

在我的
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:我该如何解决这个问题


复制:

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

:

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

:

标志,指示应用程序正在执行用户请求的操作,但系统可以在空闲时休眠

文件:

如果应用程序未执行用户启动的工作,如更新屏幕内容、播放音乐或下载文件,系统可能会将应用程序置于应用程序Nap中

您的应用程序正在使用
后台

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

还有文件

App-Nap通过调节应用程序的CPU使用量降低其定时器的触发频率来节省电池寿命

。。。这就是你可能看到的结果


即使我指定了
latencyCritical
,系统仍然可以让我的应用程序打盹,因为我只指定了
Background

对。你可以自己检查一下。运行应用程序,打开活动监视器,右键单击表格标题行,然后添加应用程序“午睡和防止睡眠”列。让应用程序运行一段时间,几分钟就足够了,然后检查这些列值

从本质上讲,应用程序Nap的条件是否简化为:如果不是用户启动的,并且它没有更新视图,则可能会被设置为Nap?

不,检查文件

通常,在以下情况下,应用程序是应用程序Nap的候选程序:

  • 它不是前台应用程序
  • 它最近没有更新窗口可见部分的内容
  • 听不见
  • 它没有接受任何IOKit电源管理或NSProcessInfo断言
  • 它没有使用OpenGL
当满足上述条件时,OS X可能会将应用程序置于应用程序Nap中

还请注意差异-可能会放!=将把。。。它背后的启发和它的行为可能略有不同,在不同的macOS版本

我的应用程序在打开时会运行多个进程,这些进程都不是由用户启动的,但对于用户来说,不中断运行非常重要,因此,如果我将其保留为我的配置,但使其作为定期计时器的一部分更新视图,则应免除应用程序Nap?

我不会太关注用户发起的单词<代码>用户发起的
文档说明:

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

它基本上意味着用户正在等待的任何东西。如果您正在更新UI,则基于用户未通过某些按钮启动的某些任务的输出,例如,它仍然可以是用户请求的操作(用户启动您的应用程序以获得一些结果,…)

更多信息

我不知道你的应用程序应该做什么->很难推荐任何实现方法。但我强烈建议观看:

全文如下:


即使这些演示文稿是旧的,它也是一个存档文档。。。它仍然有效,并包含许多有用的信息。

我应该提到,我正在通过Visual Studio for Mac以调试模式运行此应用程序。谢谢。只是想澄清一下:1)即使我指定了
latencyCritical
,系统仍然可以让我的应用程序打盹,因为我只指定了
Background
?2) 从本质上讲,应用程序Nap的条件是否简化为:如果不是用户启动的,并且它没有更新视图,那么它可能会被设置为Nap?3) 我的应用程序在打开时会运行多个进程,其中没有一个是用户启动的,但对于用户来说,无中断运行非常重要,因此如果我将其保留为现有配置,但使其作为定期计时器的一部分更新视图,它应该被豁免App Nap?奖励,但只有在我之前评论中的项目得到澄清后才能接受答案。@Ash用其他信息更新了答案。你真的应该看这些演示文稿。鉴于我确实做出了
NSProcessInfo
断言,我不完全理解我的应用程序是如何成为应用程序nap的候选程序的……如果断言需要包含
userInitiated
,那么这就是我所说的第(2)点。无论如何,我接受了这个答案,因为它解决了我眼前的打盹问题;添加了
userInitiated
,尽管措辞没有意义,但按照您所说的不关注措辞。