Несколько асинхронных веб-запросов для обработки сценария синхронизации - PullRequest
0 голосов
/ 23 февраля 2011

Я работаю над приложением WP7, которое синхронизируется с облачным REST API.Для обработки синхронизации есть несколько вызовов, которые должны быть упорядочены, так как результат последнего вызова используется в следующем.Я использую RestSharp для обработки вызовов и замыканий для вложения.Я заканчиваю тем, что шаблон выглядит так:

void SyncMe()
{
  MyProvider tp = new MyProvider(_userInfo.UserKey);
  AccountInfoProvider.GetAccountInfo(_userInfo, (accountInfoArgs) =>
  {
    if (accountInfoArgs.Status == ResponseStatus.Success) {

      var set1 = from t in coll
                     where t.SyncStatus == SyncStatus.New
                     select t;

      tp.AddRange(set1, (response) =>
      {
        if (response.Status == ResponseStatus.Success) // Keep going
        {
          HandleStep1(response.MySet);

          var set2 = from t in coll
                             where t.SyncStatus == SyncStatus.Deleted
                             select t;

          tp.DeleteRange(set2, (deleteResponse) =>
          {
            if (deleteResponse.Status == ResponseStatus.Success) {

              // Check if items were updated on the server since last sync
              if (accountInfo.LastEdited > _userInfo.UserLastSync) {
                tp.Query(new Query() { ModifiedAfter = _userInfo.UserLastSync }, (results) =>
                {
                  if (results.Status == OperationStatus.Success) {
                    HandleStep2(tp);
                  }
                  else {
                  }
                });
              }
              else {
                HandleStep2(tp);
              }
              //callback(new SyncCompletedEventArgs(ResponseStatus.Success));
            }
            else {
            }
          });
        }
        else {
        }
      });
    }
    else {
    }
  });
}

}

, что, по общему признанию, довольно уродливо.Есть лучший способ сделать это?Я пробовал ManualResetEvents и не могу заставить их работать (когда я вызываю WaitOne (), приложение просто зависает).Я искал Rx, и я пытаюсь выяснить, может ли это чем-нибудь помочь здесь, но документация не требует решения.Вся модель Async здесь усложняет реализацию здесь, где вызовы синхронизации были бы простыми.Есть мысли о более элегантном подходе?

Спасибо, К

1 Ответ

0 голосов
/ 23 февраля 2011

Реактивные расширения могут оказаться полезными в этом сценарии.Джесси Либерти имеет замечательную серию сообщений о Reactive Extensions , в последней из которых обсуждается асинхронные обратные вызовы с Rx .

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