无法使用 Windows Phone 后台任务进行异步调用

Posted

技术标签:

【中文标题】无法使用 Windows Phone 后台任务进行异步调用【英文标题】:Unable to make asynchronous call using Windows Phone Background Task 【发布时间】:2016-08-12 07:50:49 【问题描述】:

我的 Windows Phone Silverlight 8.1 应用程序有一个后台任务。

后台任务运行良好,但是当我将调用异步方法放入其中时,它只是在此阶段冻结。使用调试器,它就停止了。我无法单步执行代码或任何内容。

下面是我的代码:

public sealed class bgTask : IBackgroundTask
    
        public async void Run(IBackgroundTaskInstance taskInstance)
        
            BackgroundTaskDeferral _deferral = taskInstance.GetDeferral();

            DateTime timeNow = DateTime.Now;
            TimeSpan minus28 = new TimeSpan(0, 28, 0);
            DateTime timeGone = timeNow.Subtract(minus28);

            int resultsCount = await GetCount();

            ToastTemplateType toastTemplate = ToastTemplateType.ToastText02;
            XmlDocument toastXml = ToastNotificationManager.GetTemplateContent(toastTemplate);
            XmlNodeList textElements = toastXml.GetElementsByTagName("text");
            textElements[0].AppendChild(toastXml.CreateTextNode("New Pictures!"));
            textElements[1].AppendChild(toastXml.CreateTextNode(resultsCount + " new images in your area"));
            ToastNotificationManager.CreateToastNotifier().Show(new ToastNotification(toastXml));

            _deferral.Complete();
        

        private async Task<int> GetCount()
        
            string page = "http://en.wikipedia.org/";

            // ... Use HttpClient.
            using (HttpClient client = new HttpClient())
            using (HttpResponseMessage response = await client.GetAsync(page))
            using (HttpContent content = response.Content)
            
                // ... Read the string.
                string result = await content.ReadAsStringAsync();

                // ... Display the result.
                if (result != null &&
                result.Length >= 50)
                
                    //resultsCount = 1888;
                
            

            return 9999;

在调试时,它将进入 GetCount() 方法,然后在 await GetCount() 部分停止。

几天来一直在尝试解决这个问题。非常感谢您的帮助。 :)

【问题讨论】:

见github.com/Microsoft/Windows-universal-samples/tree/master/… 他们有很好的例子说明你正在尝试做什么。除了您的自定义设置之外,我看到的唯一区别是它们始终在类范围级别而不是在 Run 内部定义 BackgroundTaskDeferral 【参考方案1】:

您需要在类范围内定义延迟。这是因为在创建和启动后台任务时会请求延迟。

    public sealed class bgTask : IBackgroundTask
    
        BackgroundTaskDeferral _deferral = taskInstance.GetDeferral();
        public async void Run(IBackgroundTaskInstance taskInstance)
        
            //Handle async stuff
            _deferral.Complete();
        
    

更多信息可以在这里找到:https://msdn.microsoft.com/en-us/windows/uwp/launch-resume/create-and-register-a-background-task

【讨论】:

@user3102785 如果我的回答解决了您的问题。请将问题标记为已回答。

以上是关于无法使用 Windows Phone 后台任务进行异步调用的主要内容,如果未能解决你的问题,请参考以下文章

Windows phone 8.1 后台任务突然退出

无法在 Windows Phone 8.1 中使用后台任务(需要 ID_CAP_NETWORKING,但它包含在清单中)

在 Windows Phone 8.1 中从后台任务启动应用程序

在 Windows 10 移动版上运行的 Windows Phone 8.1 应用程序的后台计时器任务中没有网络

当我使用后台任务时,Windows phone 8.1 应用程序发布失败

Windows Phone 8.1 - 从后台任务创建 WriteableBitmap 时出现异常