2011-02-23 147 views
0

我正在研究与基于云的REST API同步的WP7应用程序。为了处理同步,有几个呼叫必须按照最后一次呼叫的结果进行排序。我正在使用RestSharp处理呼叫和关闭以嵌套。我结束了是看起来像一个模式:多个异步Web请求来处理同步场景

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模型使得同步调用简单的实现复杂化了。任何想法更优雅的方法?

感谢, ķ

+0

当您从REST调用中获得响应时,是否在ManualResetEvent上调用了.Set()方法?如果你没有,那么它会无休止地等待。 – 2011-02-23 06:12:02

+0

从每个请求/响应中得到的响应的类型(数据类型)是什么,需要下一个请求? – 2011-02-23 06:14:00

+0

您需要在开始作业时调用Reset(),并在完成时调用Set(),以便WaitOne()将取消阻止。 – 2011-02-23 07:32:18

回答