Модель потоков службы UWP - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь разработать расширение для Microsoft Edge на основе собственных сообщений, а в официальном руководстве содержит пример . И есть синхронизация доступа к словарям AppServiceConnections и их Deferrals в методе OnBackgroundActivated, но в других методах обработки событий такого нет ...

Так что мой вопрос касается модели потоков в UWP App Service. Гарантируется ли, что одновременно может выполняться только один метод обработки событий? Или я должен обеспечить правильную синхронизацию доступа к моим данным?

Безопасен ли AppServiceConnection поток? Могу ли я использовать SendMessageAsync из разных потоков одновременно? Или я должен синхронизировать его использование?

1 Ответ

0 голосов
/ 30 апреля 2018

Полагаю, ваша проблема в том, что вы не видите ключевое слово lock внутри событий, таких как OnAppServiceRequestReceived, OnAppServicesCanceled и т. Д., Что должно выполнять синхронизацию потоков, и вы не уверены, следует ли это делать самостоятельно.

Я думаю, что ответом должно быть "нет". lock внутри OnBackgroundActivated гарантируется правильная установка desktopBridgeConnectionIndex или connectionIndex. Без ключевого слова lock внутри этих дескрипторов событий не означает, что дескриптор события должен запускаться только один раз за раз. Для одной службы приложения, если клиент A подключает службу приложения, в то же время другой клиент B запрашивает ту же службу приложения, для этого сценария служба приложения запускает другой экземпляр той же фоновой задачи. Таким образом, для клиента A, его соединения со службой приложения, нет никакого побочного эффекта для клиентского приложения B. Другими словами, каждое соединение со службой приложения имеет свой собственный экземпляр, отправка сообщений на основе одного соединения со службой приложения не имеет влияния на другие. Вы можете сослаться на это видео , чтобы посмотреть более подробную информацию о сервисе приложений, относительный сервис приложений начинается примерно с 25-й минуты.

Если вы проверите фрагмент кода внутри события, вы можете увидеть, что есть строки кода для оценки запроса от какого соединения службы приложения, например this.desktopBridgeConnection = desktopBridgeConnections[this.currentConnectionIndex]. Вы отправите сообщение для исправления AppServiceConnection, и это должно быть потокобезопасным. Если при выполнении этого вы столкнулись с реальной проблемой сохранения потока, вы можете задать проблему с подробностями тестирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...