后台事件触发时程序终止
Posted
技术标签:
【中文标题】后台事件触发时程序终止【英文标题】:Program Terminates when Background Event Fire 【发布时间】:2014-11-04 15:37:08 【问题描述】:我制作了一个背景任务演示。这是此问题中解决方案的 95% 副本: Windows Phone 8.1 Background Task - Can't Debug and won't fire
解决方案的完整示例可以在这里下载:http://1drv.ms/1qCPLMY
问题是当我的事件触发程序终止时。 “我的”解决方案可以在这里下载:http://1drv.ms/1x3z7Mp
所以这里是“我的”代码:
首先是实现IBackgroundTask的类
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Windows.ApplicationModel.Background;
using Windows.Data.Xml.Dom;
using Windows.UI.Notifications;
namespace Tasks
public sealed class Upload : IBackgroundTask
public void Run(IBackgroundTaskInstance taskInstance)
Debug.WriteLine("Hello IBackgroundTask");
//return;
var toastXml = ToastNotificationManager.GetTemplateContent(ToastTemplateType.ToastText02);
var textElements = toastXml.GetElementsByTagName("text");
var networkStateChangeEventDetails = (taskInstance.TriggerDetails as Windows.Networking.Connectivity.NetworkStateChangeEventDetails);
if (networkStateChangeEventDetails == null)
return;
textElements[0].AppendChild(toastXml.CreateTextNode("I'm message from your task!"));
ToastNotificationManager.CreateToastNotifier().Show(new ToastNotification(toastXml));
这是注册后台任务的代码:
private async void Button_Click(object sender, RoutedEventArgs e)
Debug.WriteLine("Registering task");
var taskRegistered = false;
var exampleTaskName = "UploadTask";
foreach (var task in BackgroundTaskRegistration.AllTasks)
if (task.Value.Name == exampleTaskName)
//taskRegistered = true;
task.Value.Unregister(true);
// break;
await BackgroundExecutionManager.RequestAccessAsync();
if (!taskRegistered)
Debug.WriteLine("Registering task inside");
var builder = new BackgroundTaskBuilder();
builder.Name = exampleTaskName;
builder.TaskEntryPoint = "Tasks.Upload";
builder.SetTrigger(new SystemTrigger(SystemTriggerType.NetworkStateChange, false));
BackgroundTaskRegistration task = builder.Register();
//task.Completed += new BackgroundTaskCompletedEventHandler(NetworkStateChangeTaskOnCompleted);
//task.Trigger += new BackgroundTaskCompletedEventHandler(NetworkStateChangeTaskOnCompleted);
await new MessageDialog("Task registered!").ShowAsync();
private void NetworkStateChangeTaskOnCompleted(BackgroundTaskRegistration sender, BackgroundTaskCompletedEventArgs args)
var toastXml = ToastNotificationManager.GetTemplateContent(ToastTemplateType.ToastText02);
var textElements = toastXml.GetElementsByTagName("text");
textElements[0].AppendChild(toastXml.CreateTextNode("NetworkStateChangeTaskOnCompleted() =>"));
textElements[0].AppendChild(toastXml.CreateTextNode("I'm message from your task!"));
ToastNotificationManager.CreateToastNotifier().Show(new ToastNotification(toastXml));
我没有得到任何异常,也没有错误消息。当事件触发时,程序就终止了。在设备和模拟器上相同。
【问题讨论】:
您仍然需要在问题中包含相关代码。使您的问题自成一体,这样如果将来链接中断,您的问题仍然有意义。 有趣的事情。我发布了一个 4 人讨厌它的问题。甚至没有人看过它 人们不想费力完成整个解决方案,而您在调试自己或提供问题的最小示例时表现出零努力,这没什么好笑的。 那么你去@eddie_cat,也许你可以看看问题 【参考方案1】:我已经检查了您的项目,您需要改进以下几点:
首先也是最重要的 - 您的 BackgroundTask 必须是 Windows 运行时组件 而不是 类库(现在这样) - 打开属性后台任务并更改它。 BackgroundTask 必须是运行时组件 - 这就是您的程序终止的原因。 您还需要将命名空间更改为项目的(文件)名称——在这种情况下,您将拥有Task.Upload
(而不是Tasks.Upload
)。还记得在 package.appxmanifest 文件中更改 Declarations 中的条目。
正如我在此更改后尝试过的那样,您的应用应该可以正常工作。
【讨论】:
以上是关于后台事件触发时程序终止的主要内容,如果未能解决你的问题,请参考以下文章
跪请高手指教----- C# 页面按钮点击以后不触发后台事件,一般是啥原因?