首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >UWP:如何通过异步调用优化WCF WebServices和SQLite之间的同步

UWP:如何通过异步调用优化WCF WebServices和SQLite之间的同步
EN

Stack Overflow用户
提问于 2016-11-17 23:05:44
回答 1查看 98关注 0票数 0

我必须同步来自WCF WebServicesSQLite数据库中的数据。这个同步代表了十几个WebServices,可以分为4类:

  • 用户的”权限
  • "Forms“数据,可以从双方(用户/服务器)进行更新
  • “”数据,这些数据仅从服务器更新
  • 视图”数据,在本地复制服务器的视图

对WebService的每次调用都是通过HttpClient完成的。

代码语言:javascript
运行
复制
response = await client.PostAsync(webServiceName, content);

每个WebService都有自己的异步方法,其中WebService响应为WebService。

代码语言:javascript
运行
复制
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的调用:

代码语言:javascript
运行
复制
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;
}

最后,在main ViewModel中,我调用以下每个方法:

代码语言:javascript
运行
复制
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;
}

但由于使用了“等待”,表现不佳。

=>我想知道是否有一种简单的方法来“并行化”调用以优化性能?或者,是否可以将数据恢复与SQLite更新分开?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-18 08:02:51

从表面上看,似乎有机会同时运行一些东西,例如在SynchronizeData中,您可以这样做:

代码语言:javascript
运行
复制
{
    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;
}

...which将允许这4个任务并发运行。

您也可以在SynchronizeServerData中这样做;例如:

代码语言:javascript
运行
复制
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是否允许您执行多个并发请求--我不知道这个问题的答案。

其他一些评论:

代码语言:javascript
运行
复制
public async void SynchronizeData(bool firstSync)

async void几乎总是不正确的,除了事件处理程序和罕见的触发和遗忘方法之外,通常async Task就是您想要的。找出原因的任何好答案。

最后,您真正应该做的是分析代码,以查看真正的瓶颈所在。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40666656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档