Подобные вопросы, похоже, ведут себя как автобусы. Вы не видите ничего целую вечность, тогда два приходят почти одновременно. Посмотрите этот ответ на более конкретную версию этого вопроса, заданного ранее сегодня.
Я должен согласиться с вами, прохождение продолжения сложно. Действительно полезный метод - заимствовать конструкцию C # yield return
для создания машины, которая способна поддерживать состояние между асинхронными операциями. Для действительно хорошего объяснения см. Этот блог Джереми Ликнесса.
Лично я предпочитаю подход «меньше - больше», поэтому AsyncOperationService - это очень маленький кусок кода. Вы заметите, что он имеет единый обратный вызов как для успеха, так и для отказа, и нет интерфейсов для реализации только умеренного делегата Action<Action<Exception>>
, который набирается как AsyncOperation
, чтобы сделать его более удобным.
Основные шаги для кодирования этого: -
- Код, как если бы синхронное выполнение было возможно
- Создание методов, которые возвращают
AsyncOperation
fpr только наименьшую часть, которая должна быть асинхронной. Обычно некоторые WebRequest
или WCF-вызовы, но заметьте, что достаточно, чтобы обойти бит асинхронности, см. Другой ответ для хорошего примера.
- Преобразуйте синхронный «псевдо-код» в
yeild
эти AsyncOperations и измените вызывающий код на «Выполнить» в результате перечисления.
Окончательный код выглядит очень похоже на синхронный код, с которым вы можете быть более знакомы.
Что касается случайного запуска вещей в фоновом потоке, последний ответ включал в себя эту полезную AsyncOperation: -
public static AsyncOperation SwitchToUIThread()
{
return (completed => Deployment.Current.Dispatcher.BeginInvoke(() => completed(null)));
}
Вы можете использовать это как последний yield
в прогоне, чтобы гарантировать выполнение кода в обратном вызове completed
в потоке пользовательского интерфейса. Также полезно «перевернуть», по-видимому, синхронный код для выполнения в потоке пользовательского интерфейса при необходимости.