Синхронизация множественных асинхронных запросов - PullRequest
3 голосов
/ 17 декабря 2009

Я занимаюсь разработкой приложения Silverlight, которое отправляет несколько асинхронных запросов нескольким веб-службам. Я хочу, чтобы модальный диалог «загрузки» оставался активным, пока все запросы не будут выполнены. Я управляю ситуацией, используя переменную-счетчик, которая увеличивается с каждым событием запуска асинхронного запроса, и уменьшается с каждым событием завершения асинхронного (мне не кажется потокобезопасным) Когда счетчик равен нулю, свойство, связанное с пользовательским интерфейсом, отключает диалог. Есть ли лучший / более общий способ решения этой проблемы, чем мой встречный ответ?

1 Ответ

0 голосов
/ 17 декабря 2009

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

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

Вы правы насчет небезопасности int. Если вы используете блокированные операции (см. Комментарии) или блокируете переменную, вы можете обеспечить безопасность своей реализации.

Почему ключевое слово volatile не работает: при изменении переменной несколькими потоками для декремента требуется взаимосвязанная операция, технически операция чтения + записи. Это связано с тем, что другой поток может изменить значение между чтением и записью.

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