Получить доступ к состоянию универсального приложения Windows 8.1 / общедоступной переменной из компонента winrt

#c# #concurrency #win-universal-app #windows-8.1-universal #winrt-component

#c# #параллелизм #win-universal-app #windows-8.1-universal #winrt-component

Вопрос:

У меня есть универсальное приложение для платформы Windows, и для проверки фона я использую компонент winrt (отдельный проект в решении). Я регистрирую его правильно, и система запускает мой класс winrt каждые 15 минут. Проблема в том, что мое приложение использует те же файлы и выполняет те же проверки, что и программа проверки фона. Итак, мне нужно знать, работает ли мое приложение (фоновое или на переднем плане), чтобы пропустить проверку фона, чтобы избежать многопоточного доступа к файлам. Есть ли какой-либо способ получить доступ к состоянию моего приложения из компонента winrt или системы запросов, активно ли мое приложение?

Ответ №1:

После юбилейного обновления теперь стало возможным запускать фоновые задачи из того же процесса, что и основное приложение. Фоновая задача и основное приложение используют одну и ту же память. См. раздел Создание и регистрация фоновой задачи с одним процессом для получения информации о том, как это сделать.

Если вы хотите сохранить фоновую задачу в отдельном процессе от основного приложения, тогда вы можете использовать именованный EventWaitHandle:

Код приложения переднего плана

 // Keep this handle alive for the duration of your app
eventHandle = new EventWaitHandle(true, EventResetMode.ManualReset, "MyApp");
  

Фоновый код приложения

 EventWaitHandle handle;

if (EventWaitHandle.TryOpenExisting("MyApp", out handle)) {
    // Foreground app is running
} else {
    // Foreground app is not running
}
  

Здесь нужно учитывать возможные условия гонки (если это проблема для вашей ситуации). Вероятно, вы могли бы лучше использовать EventWaitHandle для синхронизации любой файловой задачи, которую необходимо выполнить обоим процессам.

Комментарии:

1. Спасибо! Но фоновая задача с одним процессом недоступна в uwp 8.1. Это решило бы так много проблем, если бы. 1. значит, когда мое приложение закрывается, var eventHandle собирается и автоматически не регистрируется в масштабах всей системы? 2. Не совсем понимаю состояние гонки — если я вижу, что приложение запускается, я ничего не делаю. Или вы имеете в виду, что я могу ввести «else», когда приложение отключено, и продолжить проверку, когда приложение подключится к Сети?

2. UWP доступен только для Windows 10. Я предположил, что вы разрабатываете для Windows 10, поскольку оно было помечено uwp . Однако метод EventWaitHandle все равно должен работать для Windows 8.1. Он будет автоматически закрыт, когда процесс завершится. Что касается условия гонки, я просто имею в виду, что может быть небольшая вероятность того, что фоновая задача запустится первой, увидит, что процесс переднего плана не запущен, затем процесс переднего плана запустится и попытается получить доступ к файлам.

3. uwp — это не только win 10, изначально это было для 8.1, но теперь почти невозможно найти документы для uwp 8.1. Но он существует. У меня есть приложения uwp онлайн — большая часть кода доступна для winphone 8.1 и win 8.1. Другое дело, что msft не будет обновлять некоторые устройства до 10 (а некоторые даже до 8.1), но мне также нужно поддерживать моих старых пользователей. Я начал разрабатывать для winmob с wince 3.0, но такая ситуация возникает с каждым крупным обновлением — msft ненавидит своих клиентов. Для разработчиков — я думал так же, но когда я начал разрабатывать для iOS / OSX, я обнаружил, что есть большее зло, чем msft 🙂

4. UWP — это универсальная платформа Windows , представленная в Windows 10. В Windows 8.1 была концепция «Универсальных приложений», но это просто означало, что код мог быть общим для настольных компьютеров и мобильных устройств.

5. о, моя вина. но с точки зрения разработки совместное использование кода достаточно «универсально» (по сравнению с проблемами до версии 8.1), слишком похожие термины, чтобы путать 🙂 Я бы сказал, что universal app 8.1 выглядит как бета-версия для 10 (даже большинство связанных документов исчезли), но для 8.1 не было «релиза», поэтому у нас есть то, что нам дала msft.