【发布时间】:2016-05-05 18:24:07
【问题描述】:
先了解一下上下文
我有一个 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();
问题
当我开始直播时,一切都很完美。只有在不与设备交互约 10 秒后,它才会变得非常慢。我已经从后台线程输出了更新的数量,它们的速度似乎慢了很多。我通常会得到大约 2-6 个更新来处理每个更新 (60fps)。当它超级慢时,我会得到 1 次 6 次更新周期。
让我感到困惑的一件事是:当我拉下 iOS 顶部栏菜单时,更新又回来了,并且流突然恢复了正常速度。更新率上升了约 10 秒,然后又回到了疯狂的滞后状态。
我的尝试
我试图启动一个只有这个的调度队列,像这样:
DispatchQueue queue = new DispatchQueue("updateQueue");
queue.DispatchAsync(this.UpdateProcess);
这似乎没有任何帮助。
我还尝试在我的更新线程中更改 QualityOfService 属性,如下所示:
NSThread.Current.QualityOfService = NSQualityOfService.UserInitiated
也不行!在我看来,iOS 出于某种原因降低了我的线程的优先级。如果我在我的UpdateMethod 方法中设置一个断点,那么当应用程序没有滞后时它就会被命中。但是当有滞后时,断点不会被击中。现在这真的让我很困惑,因为代码仍然运行!我仍然收到更新,只是速度变慢了...
编辑:我使用 Instruments 进行了测试,发现网络受到限制...正在调查,但如果有人知道 iOS 上的任何类型的网络限制,请告诉我。
【问题讨论】:
标签: c# ios multithreading xamarin xamarin.ios