Предполагая, что это должна быть асинхронная операция, теоретически это может произойти в любом случае. Асинхронная операция должна выполняться в другом потоке, и если она завершается до возврата Load
, обратный вызов может быть вызван до завершения присваивания.
На практике я ожидаю, что асинхронный вызов займет намного больше времени, чем любая уборка Load
в конце метода, но я также не стал бы включать это предположение в код. Если нет явной синхронизации, гарантирующей, что присваивание произойдет до обратного вызова, я не думаю, что на нее стоит полагаться.
Даже если в данный момент присваивание всегда происходит первым, учтите:
- Что произойдет, если в данный момент нет подключения к сети? Асинхронный вызов может очень быстро завершиться ошибкой.
- Что произойдет, если кеширование будет добавлено на стороне клиента? Вызов может быть успешным очень быстро.
- Я не знаю, какое тестирование вы можете проводить против служб RIA, но иногда вам может понадобиться имитировать асинхронные вызовы, заставляя их выполнять обратный вызов в том же потоке, что означает обратный вызов может произойти в тестах перед заданием. Этого можно было бы избежать, запустив по-настоящему асинхронный фиктивный вызов, но обработка многопоточности в тестах может стать сложной задачей; иногда проще всего сделать все синхронно.
РЕДАКТИРОВАТЬ: я думал об этом больше и пытался выяснить причины, по которым я интуитивно чувствую, что вы не должны делать это предположение, хотя в реальности это почти всегда будет хорошо.
Опираться на порядок операций противоречит духу асинхронности.
Вы должны (IMO) что-то запускать и быть готовым к тому, что это вернется в любое время. Вот как вы должны думать об этом. Как только вы начнете спускаться по скользкой дорожке «Я уверен, что смогу выполнить небольшую работу, прежде чем будет получен ответ», вы окажетесь в мире неопределенности.
person
Jon Skeet
schedule
07.10.2010