2

Есть ли способ синхронизировать несколько экземпляров одной фоновой задачи?Управление экземплярами фоновых задач

Я работаю над универсальным проектом магазина 8.1 окон. У меня есть фоновое задание, которое получает необработанные уведомления и загружает и обновляет некоторые данные (надеюсь, что будет соответствовать квоте ЦП и ограничениям времени выполнения).

Я хочу избежать одновременной работы фона на Windows Phone, когда сразу появляется несколько нажатий. То есть, фоновая задача должна проверить, работает ли другой экземпляр и тихо выходит.

Единственный способ, которым я мог думать, был через файл семафора в локальном хранилище ... Но поскольку все файлы IO на WP асинхронны, я не вижу, как я мог бы заставить его работать без условий гонки.

Любые идеи?

+0

Вы спрашиваете только о WP8.1 или также W10? - вы отметили [тег: uwp], который обозначает W10. – Romasz

+0

Ну, они называли это Universal Store Application для Windows 8.1. Хорошо, я удалю тег. –

ответ

2

Есть объекты для синхронизации между процессами, и их использование намного лучше, чем сигнализация с файлом. Вы можете подумать об использовании EventWaithHandle или Mutex с именем для глобальной синхронизации. Он может работать между несколькими процессами (не только потоками). Хорошим примером этой синхронизации вы можете найти at Alabhari's blog.

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

Что касается waithandles, вы можете найти более подробную информацию на странице this question.

+0

Спасибо! Не знал, что EventWaithHandle работает между процессами. Однако вопрос: что произойдет, если OS уничтожит процесс, который заблокировал EventWaithHandle, прежде чем он сможет сигнализировать? –

+0

Итак, чтобы использовать эту технику, я делаю следующее: 'bool createNew; var handle = new EventWaitHandle (false, EventResetMode.ManualReset, "bglock", out createNew); '; если флаг createNew поднят, тогда я только что заблокировал системное событие «bglock», иначе другой процесс удерживает его в данный момент, и я должен выйти. Правильно ли я это понимаю? –

+0

Будет ли этот подход полагаться на то, что я удаляю EventWaitHandle, когда работа будет завершена? Это может не произойти вообще, потому что ОС может убить мой процесс в любой момент, даже не запустив какое-либо событие на меня или что-то в этом роде. С файлами я, по крайней мере, мог проверить, что файл семафора времени был создан для обнаружения устаревших блокировок. –