Метод callBack вызывается до или после присваивания? - PullRequest
2 голосов
/ 07 октября 2010

У меня есть код ниже, который в основном вызывает доменную службу в приложении SilverLight.

LoadOperation<tCity> loadOperation = _dataContext.Load(query,callBack, true);

Можете ли вы сказать мне, какая операция выполняется в первую очередь?

Вызывается ли метод callBack до назначения переменной loadOperation или после ее назначения?

Спасибо

Ответы [ 3 ]

2 голосов
/ 07 октября 2010

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

На практике я бы ожидал, что асинхронный вызов займет намного дольше, чем домашняя работа Load делает в конце метода - но я бы также не включил это предположение в код. Если нет явной синхронизации , чтобы гарантировать, что назначение происходит до обратного вызова, я не думаю, что это хорошая идея, чтобы полагаться на него.

Даже если в данный момент назначение всегда происходит первым, рассмотрим:

  • Что произойдет, если в данный момент нет сетевого подключения? Асинхронный вызов может очень быстро завершиться неудачей.
  • Что произойдет, если будет добавлено некоторое кэширование на стороне клиента? Звонок может быть выполнен очень быстро.
  • Я не знаю, какое тестирование вы можете провести с помощью служб RIA, но иногда вы можете захотеть имитировать асинхронные вызовы, заставляя их выполнять обратный вызов в том же потоке - что означает обратный вызов может произойти в тестах до назначения. Этого можно избежать, форсировав подлинно асинхронный вызов, но обработка потоков в тестах может привести к ошибкам; иногда проще всего сделать все синхронно.

РЕДАКТИРОВАТЬ: Я больше думал об этом и пытался выяснить причины моего внутреннего настроения, что вы не должны делать это предположение, даже если в реальности почти всегда все будет хорошо.

Опора на порядок действий противоречит духу асинхронности.

Вы (IMO) должны что-то отключить и быть готовыми к тому, что оно может вернуться в любое время Вот как вы должны думать об этом. Как только вы начнете спускаться по скользкому склону «Я уверен, что смогу просто выполнить небольшую работу до того, как ответ будет получен», вы окажетесь в мире неопределенности.

0 голосов
/ 14 октября 2010

Есть 3 возможных ответа на этот очень специфический вопрос об услугах RIA:

  1. Возвращает назначение до обратного вызова.
  2. Возможно, что обратный вызов произошел до назначения.
  3. Вам все равно.

Дело 1: Основываясь на исследовании .Net Reflector фактического рассматриваемого метода загрузки, кажется невозможным вызвать обратный вызов до того, как произойдет возврат. (Если кто-то хочет доказать, что он может объяснить тонкости раскручивания фоновых нитей).

Дело 2: Доказательство того, что «небо падает» возможно, должно быть указано в отраженном коде. (Если кто-то хочет поддержать это, он также может объяснить тонкости создания фоновых потоков).

Дело 3: В действительности возвращаемое значение метода загрузки RIA Services обычно используется для назначения отложенной загрузки источника данных. Это не используется обратным вызовом. Обратному вызову передается собственный контекст загруженных данных в качестве параметра.

StackOverflow - это практические ответы кода, поэтому единственный практический ответ - вариант 3:

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

0 голосов
/ 10 октября 2010

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

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