上下文优先
我有一个Xamarin应用程序,实质上是从远程服务器上传输视频。我有一个像这样循环的后台线程(伪代码):
private void UpdateMethod()
{
while (running)
{
bool success = WaitForUpdate();
if (!success)
{
break;
}
Update update = GetUpdate();
SendUpdateToConcurentQueue(update);
}
Disconnect();
}我以这样的方式启动后台线程:
Thread thread = new Thread(UpdateMethod);
thread.IsBackground = true;
thread.Start();The issue
当我开始流淌时,一切都是完美的。只是在没有与设备交互的10秒之后,它才变得非常慢。我已经从后台线程输出了更新的数量,它们的速度似乎要慢得多。我通常得到大约2-6个更新进程每次更新(60 get )。当它是超慢,我得到一个任何时候6更新周期。
有一件事让我感到困惑:当我拉下iOS顶部的菜单时,更新会重新启动,流会突然恢复正常速度。更新率上升了10秒,然后又回到了疯狂的滞后状态。
我试过什么
我试图启动一个只有以下内容的调度队列:
DispatchQueue queue = new DispatchQueue("updateQueue");
queue.DispatchAsync(this.UpdateProcess);这似乎一点帮助都没有。
我还试图在更新线程中更改QualityOfService属性,如下所示:
NSThread.Current.QualityOfService = NSQualityOfService.UserInitiated也不起作用!在我看来,iOS由于某种原因降低了线程的优先级。如果我在我的UpdateMethod方法中放置了一个断点,当应用程序没有滞后时,它就会被击中。但是当有延迟的时候,断点就不会被击中。现在这真的让我很困惑,因为代码仍然在运行!我还是收到了更新,只是速度慢了很多.
编辑:我用仪器测试,发现网络被切断了.调查,但如果有人知道任何类型的网络节流的iOS,让我知道。
发布于 2016-05-05 18:48:07
尝试将IdleTimerDisabled设置为true,我们在iOS游戏中一直这样做,以防止iOS闲置我们的游戏。
注意:我们只在polite way中这样做,只有当用户由于观看重放、更改级别的多媒体字幕等原因而不触摸屏幕时,才会这样做。
注意:当你不需要的时候,一定要重置空闲(当你的应用程序在后台运行,等等),比如杀死电池,让用户对你的应用感到沮丧:Apple拒绝。
苹果:应用程序空闲计时器信息
Xamarin:UIKit.UIApplication.IdleTimerDisabled性质
此属性的默认值为否。当大多数应用程序在短时间内没有用户输入时,系统会将设备置于屏幕变暗的“睡眠”状态。这样做是为了节省电源。然而,除了加速度计(比如游戏)之外,没有用户输入的应用程序--比如游戏--可以通过将该属性设置为“空闲计时器”来避免系统睡眠。 D.重要 只有在必要时才应设置此属性,并应确保在不再存在此属性时将其重置为“NO”。大多数应用程序应该让系统关闭屏幕时,闲置的计时器过去。这包括音频应用程序。在适当使用音频会话服务的情况下,当屏幕关闭时,播放和录制将不间断地进行。应该禁用空闲计时器的唯一应用程序是映射应用程序、游戏或应用程序,当用户交互最少时,应用程序需要继续显示内容。
https://stackoverflow.com/questions/37057661
复制相似问题