C# 当UI空闲时,iOS后台线程速度减慢

C# 当UI空闲时,iOS后台线程速度减慢,c#,ios,multithreading,xamarin,xamarin.ios,C#,Ios,Multithreading,Xamarin,Xamarin.ios,先来点背景知识 我有一个Xamarin应用程序,基本上是从远程服务器流式传输视频。我有一个循环如下的后台线程(伪代码): 我以如下方式启动背景线程: Thread thread = new Thread(UpdateMethod); thread.IsBackground = true; thread.Start(); DispatchQueue queue = new DispatchQueue("updateQueue"); queue.DispatchAsync(this.UpdateP

先来点背景知识

我有一个Xamarin应用程序,基本上是从远程服务器流式传输视频。我有一个循环如下的后台线程(伪代码):

我以如下方式启动背景线程:

Thread thread = new Thread(UpdateMethod);
thread.IsBackground = true;
thread.Start();
DispatchQueue queue = new DispatchQueue("updateQueue");
queue.DispatchAsync(this.UpdateProcess);
NSThread.Current.QualityOfService = NSQualityOfService.UserInitiated
问题

当我开始工作时,一切都很完美。只有在不与设备交互约10秒后,它才会变得非常慢。我已经从后台线程输出了更新的数量,而且它们的速度似乎慢了很多。每次更新我通常要处理2-6个更新(60帧/秒)。当它的速度非常慢时,我的更新周期为1/6

有一件事让我感到困惑:当我拉下iOS顶部栏菜单时,更新又恢复了,流突然恢复到正常速度。更新率上升约10秒,然后又回到疯狂的滞后状态

我尝试过的

我试图启动一个仅包含以下内容的调度队列,如下所示:

Thread thread = new Thread(UpdateMethod);
thread.IsBackground = true;
thread.Start();
DispatchQueue queue = new DispatchQueue("updateQueue");
queue.DispatchAsync(this.UpdateProcess);
NSThread.Current.QualityOfService = NSQualityOfService.UserInitiated
这似乎毫无帮助

我还尝试更改更新线程中的QualityOfService属性,如下所示:

Thread thread = new Thread(UpdateMethod);
thread.IsBackground = true;
thread.Start();
DispatchQueue queue = new DispatchQueue("updateQueue");
queue.DispatchAsync(this.UpdateProcess);
NSThread.Current.QualityOfService = NSQualityOfService.UserInitiated
也不行!在我看来,iOS出于某种原因降低了线程的优先级。如果我在我的
UpdateMethod
方法中设置了一个断点,那么当应用程序没有延迟时就会命中它。但是当存在延迟时,断点不会被命中。这让我很困惑,因为代码仍然在运行!我仍然收到更新,只是速度慢了很多


编辑:我使用仪器进行了测试,发现网络正在被限制。。。正在调查,但如果有人知道iOS上的任何类型的网络限制,请告诉我。

尝试将
IdleTimerDisabled
设置为
true
,我们在iOS游戏中一直这样做,以防止iOS使我们的游戏处于空闲状态

注意:只有当用户因为观看重播、改变音量的多媒体片段等而没有触摸屏幕时,我们才以礼貌的方式进行操作

注意:确保在您不需要空闲时(当您的应用程序确实进入后台时,等等)重置空闲,从耗尽电池、让用户对您的应用程序感到厌烦到真正的杀手:苹果商店拒绝

苹果公司:

沙马林:

此属性的默认值为“否”。当大多数应用在短时间内没有触摸作为用户输入时,系统会将设备置于屏幕变暗的“睡眠”状态。这样做是为了节约能源。但是,例如,除了加速计游戏之外,没有用户输入的应用程序可以通过将此属性设置为“是”来禁用“空闲计时器”以避免系统睡眠

|重要的

您应该仅在必要时设置此属性,并且应该确保在不再需要时将其重置为“否”。大多数应用程序应该允许系统在空闲计时器过期时关闭屏幕。这包括音频应用程序。通过适当使用音频会话服务,当屏幕关闭时,播放和录制将不间断地进行应禁用空闲计时器的应用程序只有映射应用程序、游戏或程序,在这些应用程序中,当用户交互最少时,应用程序需要继续显示内容。


我很确定我也试过这个。。。但我会再试一次。这似乎是为了屏幕变暗,这似乎不是发生在10秒后。我只是测试了它。。。仍然滞后:(@PhilippeParé物理设备或模拟器?蜂窝(3g/4g/lte)?Wifi?任何物理设备,Wifi。@PhilippeParé“假设”在模拟器上您没有看到这种行为(?)