我正在MonoTouch应用程序中下载一些小图像(每个大约40 KB)。图像是并行下载的 - 主线程创建请求并异步执行它们。
我使用WebRequest.Create
创建HTTP请求,在完成处理程序中,我使用response.GetResponseStream()
检索响应流。然后,以下代码从响应流中读取数据:
var ms = new MemoryStream();
byte[] buffer = new byte[4096];
int read;
while ((read = responseStream.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, read);
}
当只下载一个图像时,运行速度非常快(50-100毫秒,包括等待Web请求)。但是,只要有多个图像,比如5-10,这些线条需要2秒以上才能完成。有时线程花费超过4秒。请注意,我不是在谈论response.BeginGetResponse
所需的时间或等待回调运行的时间。
然后我测试了以下代码,它在同一场景中需要不到100毫秒:
var ms = new MemoryStream();
responseStream.CopyTo(ms);
第一个版本出现这种巨大滞后的原因是什么?
我需要代码的第一个版本的原因是我需要部分下载的图像数据(特别是当图像更大时)。为了隔离性能问题,我删除了处理部分下载图像的代码。
我在模拟器和iPad 3上以调试和发布模式运行代码,我尝试了两种编译模式,LLVM和非LLVM。 所有配置,调试/发布,设备/模拟器,LLVM /非LLVM都存在滞后。
答案 0 :(得分:2)
很可能是并发http网络连接数量的限制:
http://msdn.microsoft.com/en-us/library/system.net.servicepoint.connectionlimit.aspx
答案 1 :(得分:0)
您好也许不是您问题的直接答案,但是您是否尝过SDWebImage的Xamarin Component Store?这是一个由Olivier Poitrey开发的令人惊叹的库,开箱即用,提供异步图像下载,内存+磁盘映像缓存和其他一些好处,非常好。
希望这有帮助
亚历