2011-02-23 218 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

回答