我必须在 SQLite数据库中同步来自 WCF WebServices 的数据。 此同步代表了十几个Web服务,可以“分组”为4个类别:
每次对WebService的调用都是通过 HttpClient :
完成的response = await client.PostAsync(webServiceName, content);
每个WebService都有自己的异步方法,其中WebService响应为反序列化:
public static async Task<string> PushForm(List<KeyValuePair<string, string>> parameters)
{
var response = await JsonParser.GetJsonFromUrl(WebServiceName.PushForm.Value, parameters);
Forms forms = new Forms();
try
{
forms = JsonConvert.DeserializeObject<Forms>(response);
return response;
}
catch (Exception e)
{
throw new Exception(e.Message);
}
}
然后我有一个 SynchronizationService 类,我按类别重新组合对WebServices的调用:
public async Task<bool> SynchronizeServerData()
{
bool result = false;
try
{
result = true;
List<Table1> tables1 = await WebServices.GetListTable1(null);
if (tables1 != null)
{
ServiceLocator.Current.GetInstance<IRepository>().DeleteAll<Table1>(true);
ServiceLocator.Current.GetInstance<IRepository>().AddAll<Table1>(tables1);
}
List<Table2> tables2 = await WebServices.GetListTable2(null);
if (tables2 != null)
{
ServiceLocator.Current.GetInstance<IRepository>().DeleteAll<Table2>(true);
ServiceLocator.Current.GetInstance<IRepository>().AddAll<Table2>(tables2);
}
List<Table3> tables3 = await WebServices.GetListTable3(null);
if (tables3 != null)
{
ServiceLocator.Current.GetInstance<IRepository>().DeleteAll<Table3>(true);
ServiceLocator.Current.GetInstance<IRepository>().AddAll<Table3>(tables3);
}
...
}
catch (Exception e)
{
result = false;
}
return result;
}
最后,在主ViewModel 中,我调用了以下每种方法:
public async void SynchronizeData(bool firstSync)
{
IsBusy = true;
var resUsers = await _synchronisation.SynchronizeUsersRights();
var resServer = await _synchronisation.SynchronizeServerData();
var resForm = await _synchronisation.SynchronizeForms();
var resViews = await _synchronisation.SynchronizeViews();
IsBusy = false;
}
但由于使用“等待”,表现并不好。
=&GT;我想知道是否有一种简单的方法来“并行化”调用以优化性能?或者是否可以将数据恢复与SQLite更新分开?
答案 0 :(得分:1)
从表面上看,似乎有机会同时运行一些事情,例如SynchronizeData
你可以这样做:
{
IsBusy = true;
Task resUsersTask = _synchronisation.SynchronizeUsersRights();
Task resServerTask = _synchronisation.SynchronizeServerData();
Task resFormTask = _synchronisation.SynchronizeForms();
Task resViewsTask = _synchronisation.SynchronizeViews();
await Task.WhenAll(resUsersTask, resServerTask, resFormTask, resViewsTask);
var resUsers = resUsersTask.Result;
var resServer = resServerTask.Result;
var resForm = resFormsTask.Result;
var resViews = resViewsTask.Result;
IsBusy = false;
}
...这将允许这4个任务同时运行。
您可以在SynchronizeServerData
中执行相同操作; e.g:
result = true;
Task tables1Task = WebServices.GetListTable1(null);
Task tables2Task = WebServices.GetListTable2(null);
Task tables3Task = WebServices.GetListTable3(null);
List<Table1> tables1 = await tables1Task;
// ...
List<Table2> tables2 = await tables2Task;
// ...
List<Table3> tables3 = await tables3Task;
// ...
这将允许3个任务同时运行。
你实际从中获得多少可能取决于像SQLite允许你做多个并发请求的事情 - 我不知道答案就是这样。
其他一些评论:
public async void SynchronizeData(bool firstSync)
除了事件处理程序和罕见的“即发即弃”方法之外, async void
几乎总是不正确的,通常async Task
就是你想要的。搜索SO以获取有关原因的任意数量的好答案。
最后,你真正应该做的是分析代码,看看你真正的瓶颈在哪里。