Программа завершается при возникновении фонового события

Я сделал демо-версию BackgroundTaks. Это 95% копия РЕШЕНИЯ в этом вопросе: Фоновая задача Windows Phone 8.1 — не удается отладить и не запускается

Полный пример РЕШЕНИЯ можно скачать здесь: 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));
}

Я не получаю никаких исключений и сообщений об ошибках. Программа просто завершается, когда срабатывает событие. То же самое и на устройстве, и на эмуляторе.


person Jens Borrisholt    schedule 04.11.2014    source источник
comment
Вам все еще нужно включить соответствующий код в свой вопрос. Сделайте свой вопрос автономным, чтобы, если в будущем ссылки сломаются, ваш вопрос по-прежнему имел смысл.   -  person eddie_cat    schedule 04.11.2014
comment
Забавная вещь. Я размещаю вопрос 4 человек ненавидят его. и никто даже не смотрел на это   -  person Jens Borrisholt    schedule 04.11.2014
comment
Ничего смешного в том, что люди не хотят разбираться со всем решением, которое вы не приложили для самостоятельной отладки или предоставили минимальный пример проблемы.   -  person eddie_cat    schedule 04.11.2014
comment
Итак, @eddie_cat, возможно, вы могли бы посмотреть на проблему   -  person Jens Borrisholt    schedule 04.11.2014


Ответы (1)


Я проверил ваш проект, есть несколько вещей, которые вам нужно улучшить:

  • первое и самое важное: ваша BackgroundTask должна быть Windows Runtime Componenet, а не библиотекой классов (как сейчас) — откройте свойства Background Задайте и измените его. BackgroundTask должен быть компонентом среды выполнения, поэтому ваша программа завершается.
  • вам также нужно будет изменить пространство имен на имя проекта (файла) - в этом случае у вас будет Task.Upload (вместо Tasks.Upload). Не забудьте также изменить запись в Declarations в файле package.appxmanifest.

Как я уже пробовал, после этих изменений ваше приложение должно работать нормально.

person Romasz    schedule 04.11.2014