BackgroundTaskBuilder.Register выдает исключение

Я пытаюсь зарегистрировать фоновую задачу с помощью GattCharacteristicNotifictionTrigger для получения данных с устройства BLE, но независимо от того, что я делаю, приложение ВСЕГДА выдает исключение при достижении .Register( ) строка. Я ссылался на многочисленные руководства в MSDN И в других местах и ​​я считаю, что делаю все, что нужно. Ниже приведен контрольный список, в котором указано, что было необходимо. Я не сделал ничего больше и не меньше, что касается фоновой задачи:

1) Установите объявление для фоновой задачи в Package.appxmanifest следующим образом:

      <Extensions>
    <Extension Category="windows.backgroundTasks" EntryPoint="AgHost.BackgroundTask">
      <BackgroundTasks>
      <Task Type="systemEvent" />
      </BackgroundTasks>
    </Extension>
    <Extension Category="windows.backgroundTasks" EntryPoint="BackgroundBLEService.MyBLEService">
      <BackgroundTasks>
        <m3:Task Type="gattCharacteristicNotification" />
      </BackgroundTasks>
    </Extension>
  </Extensions>

2) Добавьте ссылку на проект WinRT, у которого есть фоновая задача в моем основном проекте приложения (кстати, это проект Silverlight 8.1)

3) Создайте функцию Run() в классе фоновой службы (который является закрытым общедоступным классом) следующим образом:

public sealed class MyBLEService: IBackgroundTask
{
    public void Run(IBackgroundTaskInstance taskInstance)
    {
        try
        {
            GattCharacteristicNotificationTriggerDetails details = (GattCharacteristicNotificationTriggerDetails)taskInstance.TriggerDetails;
            byte[] ReceivedData = new byte[details.Value.Length];
            DataReader.FromBuffer(details.Value).ReadBytes(ReceivedData);

            foreach(byte b in ReceivedData)
            {
                Debug.WriteLine(b.ToString());
                XmlDocument xml = ToastNotificationManager.GetTemplateContent(ToastTemplateType.ToastText01);
                xml.SelectSingleNode("/toast/visual/binding/text").InnerText = string.Format("Value Received: " + b.ToString());
                ToastNotification toast = new ToastNotification(xml);
                ToastNotifier notifier = ToastNotificationManager.CreateToastNotifier();
                notifier.Show(toast);
            }
        }
        finally
        {
            Debug.WriteLine("Background service exception");
        }
    }
}

4) Зарегистрируйте событие из моего основного приложения следующим образом:

            GattCharacteristicNotificationTrigger trigger = new GattCharacteristicNotificationTrigger(thermometerCharacteristic); //thermometerCharacteristic is defined in another block of code
            await BackgroundExecutionManager.RequestAccessAsync();
            BackgroundTaskBuilder BLETaskBuilder = new BackgroundTaskBuilder();
            BLETaskBuilder.Name = "DataReceiveNotifier";
            BLETaskBuilder.TaskEntryPoint = "BackgroundBLEService.MyBLEService";
            BLETaskBuilder.SetTrigger(trigger);
            App.MyBackgroundTask = BLETaskBuilder.Register();

5) Убедитесь, что последовательность строк для точки входа фоновой задачи точно соответствует написанию namespace.classname фонового проекта. Я проверил и дважды проверил правописание как в Package.appxmanifest, так и в моем основном проекте, где я пытаюсь зарегистрировать задачу.

Но я все еще получаю исключение первого шанса, когда код попадает в строку .Register(). Подробнее об исключении:

  • HРезультат: -2147221164
  • Сообщение: класс не зарегистрирован (исключение из HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))

Любая идея, что я делаю неправильно? Я нашел аналогичный вопрос здесь, но на него нет однозначного ответа .


person Ali250    schedule 12.12.2014    source источник
comment
Возможно ли, что вы можете поделиться примером проекта с проблемой?   -  person Romasz    schedule 12.12.2014
comment
Можете ли вы также проверить, работает ли ваш код с другим триггером, например TimeTrigger?   -  person Romasz    schedule 12.12.2014
comment
Теперь он генерирует исключение System.UnauthorizedAccessException в строке .Register(). Помимо добавления объявления об использовании таймера в Package.appxmanifest, требовались ли какие-либо другие изменения?   -  person Ali250    schedule 12.12.2014
comment
И весь проект довольно большой, так как в его активах есть куча аудиофайлов.   -  person Ali250    schedule 12.12.2014
comment
Взгляните на этот пример на Github — это простой фон такс с таймером. Я также получаю подобное исключение, когда у меня было неправильное имя пространства имен/класса в точке входа и в объявлениях.   -  person Romasz    schedule 12.12.2014


Ответы (3)


На всякий случай...

Когда вы используете builder.SetTrigger(new TimeTrigger(15, false)), вам нужно будет проверить Timer, а также System Event в вашем файле Package.appxmanifest. Это работало для меня.

person Vlad    schedule 09.05.2016
comment
У меня была противоположная проблема, своего рода - мой TimeTrigger работал ненадежно. В какой-то момент я добавил new SystemCondition(SystemConditionType.InternetAvailable) в регистрацию; Я предполагаю, что именно тогда была введена ненадежность. В любом случае, добавление <Task Type="systemEvent" /> в манифест решило проблему, так что спасибо. - person Petter Hesselberg; 01.11.2016

Скорее всего, имя вашего класса в TaskEntryPoint неверно. Лучше использовать BLETaskBuilder.TaskEntryPoint = typeof(ClassName).FullName вместо жестко заданной строки.

Таким образом, если вы измените имя класса и забудете сделать это где-то еще в своем коде C#, ваш код не скомпилируется, и его будет легче обнаружить из-за ошибки.

person Mentha Suaveolens    schedule 13.12.2014
comment
Пробовал. Все то же исключение. - person Ali250; 13.12.2014

ПРОБЛЕМА РЕШЕНА: проект, над которым я работал, изначально был извлечен из GitHub и нацелен на Windows Phone 8. Позже я сильно изменил его, так что появилась куча неиспользуемых страниц и ссылок, и когда я решил добавить функциональность BLE, я перенацелил его на Windows. Телефон 8.1.

Но не видя решения этой проблемы, я решил сделать последнюю попытку, создав новый проект 8.1 и скопировав весь соответствующий код из другого проекта. Я не вносил изменений в код, который вставил выше, и теперь фоновая задача работает отлично.

Просто доказывает, что ретаргетинговые проекты не всегда работают корректно.

person Ali250    schedule 13.12.2014