UWP: как оптимизировать синхронизацию между WCF WebServices и SQLite с помощью асинхронных вызововC#

Место общения программистов C#
Ответить
Anonymous
 UWP: как оптимизировать синхронизацию между WCF WebServices и SQLite с помощью асинхронных вызовов

Сообщение Anonymous »

Мне необходимо синхронизировать данные, поступающие из WCF WebServices, в базу данных SQLite.
Эта синхронизация представляет собой дюжину веб-служб, которые можно «сгруппировать» в 4 категории:
  • "Права пользователя"
  • "Формы >" данные, которые могут обновляться с двух сторон (пользователь/сервер)
  • "Сервер" данные, которые обновляются только с сервера
    Данные «Просмотры», которые локально копируют представления сервера.
Каждый вызов WebService выполняется через HttpClient:

Код: Выделить всё

response = await client.PostAsync(webServiceName, content);
Каждая веб-служба имеет свой собственный асинхронный метод, в котором ответ веб-службы десериализуется:

Код: Выделить всё

public static async Task PushForm(List parameters)
{
var response = await JsonParser.GetJsonFromUrl(WebServiceName.PushForm.Value, parameters);
Forms forms = new Forms();
try
{
forms = JsonConvert.DeserializeObject(response);
return response;
}
catch (Exception e)
{
throw new Exception(e.Message);
}
}
Затем у меня есть класс SynchronizationService, в котором я перегруппирую вызовы веб-служб по категориям:

Код: Выделить всё

public async Task SynchronizeServerData()
{
bool result = false;
try
{
result = true;
List tables1 = await WebServices.GetListTable1(null);
if (tables1 != null)
{
ServiceLocator.Current.GetInstance().DeleteAll(true);
ServiceLocator.Current.GetInstance().AddAll(tables1);
}
List tables2 = await WebServices.GetListTable2(null);
if (tables2 != null)
{
ServiceLocator.Current.GetInstance().DeleteAll(true);
ServiceLocator.Current.GetInstance().AddAll(tables2);
}
List tables3 = await WebServices.GetListTable3(null);
if (tables3 != null)
{
ServiceLocator.Current.GetInstance().DeleteAll(true);
ServiceLocator.Current.GetInstance().AddAll(tables3);
}
...
}
catch (Exception e)
{
result = false;
}
return result;
}
И, наконец, в основной модели представления я вызываю каждый из этих методов:

Код: Выделить всё

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;
}
Но из-за использования «await» производительность плохая.
=> Хотелось бы знать есть ли простой способ «распараллелить» вызовы для оптимизации производительности? Или можно для этого отделить восстановление данных от обновления SQLite?

Подробнее здесь: https://stackoverflow.com/questions/406 ... te-through
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»