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模型使得同步調用簡單的實現複雜化了。任何想法更優雅的方法?
感謝, ķ
當您從REST調用中獲得響應時,是否在ManualResetEvent上調用了.Set()方法?如果你沒有,那麼它會無休止地等待。 – 2011-02-23 06:12:02
從每個請求/響應中得到的響應的類型(數據類型)是什麼,需要下一個請求? – 2011-02-23 06:14:00
您需要在開始作業時調用Reset(),並在完成時調用Set(),以便WaitOne()將取消阻止。 – 2011-02-23 07:32:18