多个异步Web请求来处理同步场景
问题描述:
我正在研究与基于云的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模型使得同步调用简单的实现复杂化了。任何想法更优雅的方法?
感谢, ķ
答
您可能会发现在这种情况下有用的反应扩展。杰西利伯蒂有一个great series of posts on the Reactive Extensions,其中最新的讨论Asynchronous Callbacks with Rx。
当您从REST调用中获得响应时,是否在ManualResetEvent上调用了.Set()方法?如果你没有,那么它会无休止地等待。 – 2011-02-23 06:12:02
从每个请求/响应中得到的响应的类型(数据类型)是什么,需要下一个请求? – 2011-02-23 06:14:00
您需要在开始作业时调用Reset(),并在完成时调用Set(),以便WaitOne()将取消阻止。 – 2011-02-23 07:32:18