这是一个2部分问题
1)在WP7中是否可以同时运行最大数量的HttpWebRequests?
我将创建一个ScheduledTaskAgent来运行PeriodicTask。将有2个不同的REST服务调用,第一个将获取需要下载的记录的ID列表,第二个服务将用于一次下载一个记录。我不知道有多少记录会有我的guestimage + -50。
2。)将所有单独的记录请求立刻变成一个坏主意吗? (假设它可能)或者我应该在开始另一个请求之前等待请求完成?
答案 0 :(得分:5)
刚刚花了一个半星期的时间让BackgroundAgent保持在内存限制之内,我建议你一次做一个。
您丢失了大约一半的内存到系统库等,您的第一个Web请求将占用近20%,但它似乎在后续请求中重用该内存。
如果您需要将结果存储到本地数据库中,那么它将会占用更多优势。我发现CompiledQuery
使用更少的内存,这意味着保存上下文的单个实例。
在每次通话之间,我建议您执行GC.Collect()
,我甚至会添加一个简短的Thread.Sleep()
,以确保该过程有一些时间来整理。
我做的另一件事是跟踪我正在使用多少内存,并在达到97%或98%时尝试优雅地退出。
您无法使用调试器来测试内存限制,因为调试内存要高得多,并且不会强制执行限制。但是,对于代码版本之间的比较测试,调试器在后续运行相同代码时会产生非常相似的结果。
您可以使用Microsoft.Phone.Info.DeviceStatus.ApplicationCurrentMemoryUsage
和Microsoft.Phone.Info.DeviceStatus.ApplicationMemoryUsageLimit
我将状态日志写入IsolatedStorage
,这样我就可以在手机上查看运行结果并使用ScheduledActionService.LaunchForTest()
启动。然后我使用ShellToast
通知让我知道任务何时运行以及何时完成,这样我就可以启动我的应用程序来读取状态日志而不会中断它。
答案 1 :(得分:0)
我的2美分。
我不相信你可以启动HTTP HTTP请求的方式有任何限制。然而,这些必须是异步的,当然,并且可以从浏览器堆栈提供。包括IE9在内的大多数现代浏览器同时处理5个以上的域;但不保证您立即处理请求。但是,如果您愿意在一个单独的线程上等待,将您的内容转储到请求管道上,则无关紧要。等待另一个线程的响应。这篇文章(here)介绍了我们为什么需要这样做。
这种方法也没有错,IMO。您只需要等到所有请求都有各自的管道和管道。然后等待回复。
谢谢!
答案 2 :(得分:0)
1)PeriodicTask或ResourceIntensiveTask中的内存限制为5 MB。所以你一定要小心控制你的要求。我认为代码中没有限制。
2)你只有5 MB。因此,当您同时启动所有请求时,它将立即终止。
3)我认为你最好使用ResourceIntensiveTask,因为PeriodicTask只能运行15秒。
Mango中多任务功能的良好指南:http://blogs.infosupport.com/blogs/alexb/archive/2011/05/26/multi-tasking-in-windows-phone-7-1.aspx
答案 3 :(得分:0)
我似乎记得(但现在找不到引用),操作系统一次可以发出的最大请求数为7.你应该避免一次性这么多,因为它会阻止其他/系统应用程序无法提出请求。