/* 在写这个问题和测试东西时,我设法回答了这个问题,我正在分享我的发现,这样它们会对其他可怜的人有所帮助。请参阅下面的答案。 */
我正尝试在后台任务中从我的 API 获取 JSON 数据。 我有很好的后台任务并正在运行它,但是当我尝试获取数据时,没有任何反应?!?
这是我使用的代码:
protected override void OnInvoke(ScheduledTask task)
{
string wurl = @"http://test.com/api/stuff/getdata";
WebClient webClient = new WebClient();
webClient.DownloadStringCompleted += new DownloadStringCompletedEventHandler(webClient_DownloadStringCompleted);
webClient.DownloadStringAsync(new Uri(wurl));
NotifyComplete();
}
仅此而已……webClient_DownloadStringCompleted 永远不会执行。
请您参考如下方法:
这里的关键是 WebClient 异步 执行它的方法并且 NotifyComplete() 在执行之前WebClient 有机会获取数据。
当您调用 NotifyComplete() 时,它会通知操作系统您已完成任务执行,系统应终止它。
解决方案是将 NotifyComplete() 移动到异步方法 webClient_DownloadStringCompleted 的末尾(在本例中),然后……瞧!
警告 1:您最多有 25 秒的时间来完成您正在做的任何事情,否则任务将终止。
警告 2: 您的后台任务消耗的内存不能超过(在某些手机上)6 MB(在我用 Windows Phone 8 测试的模拟器上)10 MB 内存!如果您的后台任务执行了,它将被终止。
如果您的应用要消耗更多内存和时间(最多 10 分钟),最好考虑使用资源密集型后台任务,请注意此类任务仅在手机充电时可用!
