Асинхронный запрос веб-службы в формах Xamarin с использованием корпоративной библиотеки, использующей обратные вызовы - PullRequest
0 голосов
/ 18 сентября 2018

Сегодня у меня есть конкретный вопрос для конкретного сценария.

Сценарий:

  • Я занимаюсь разработкой приложения Xamarin Forms и использую PRISM (очевидно, MVVM тоже).
  • У меня есть определенные ограничения на запрос веб-службы.Один из них: мне приходится использовать корпоративную (и внутреннюю) библиотеку из-за безопасности и политики в моей работе.
  • Эта корпоративная библиотека предоставляет методы для запроса веб-сервисов с помощью обратных вызовов.Один из них выглядит следующим образом:

    public void Post(string requestUriString, string data,
                     System.Action callbackSuccess, System.Action callbackError);
    
  • Я имею в виду, что эта библиотека не предоставляет асинхронные методы, как, например, HttpClient.Вместо этого в этой библиотеке используется обратный вызов.

  • Корпоративная библиотека имеет различные реализации для android и ios (по одной библиотеке на каждую платформу).И из-за этого мне нужно использовать внедрение зависимостей для использования кода, специфичного для платформы

У меня вопрос

Какой лучший способ реализовать эту библиотеку ( говорить о производительности и лучших практиках ) и почему?Основной вопрос состоит в том, чтобы объяснить, почему одно решение может быть лучше других, и привести пример (код).

В приведенных ниже примерах я размышлял, но не знаю, какое из них может быть лучшеили если комбинация одного из них может быть лучше, или ... ни одного из них.

  1. Вызов библиотеки напрямую из ViewModel и использование обратных вызовов: Пример использования обратных вызовов
  2. Использование System.Threading.Tasks.Task.Run в качестве оболочки из потока пользовательского интерфейса (непосредственно из ViewModel) Использование Task.Run пример
  3. Создание отдельногокласс, который содержит только запрос веб-службы, а также использует обратные вызовы в качестве асинхронного метода. Пример отдельных бизнес + обратных вызовов

1 Ответ

0 голосов
/ 18 сентября 2018

Использовать источник завершения задачи.

public static class XXXExtensions
{
    public static Task PostAsync(this XXX self, string requestUriString, string data)
    {
        var tcs = new TaskCompletionSource<bool>();
        self.Post(
           requestUriString,
           data,
           () => tcs.TrySetResult(true)
           () => tcs.TrySetException(new Exception()));
        return tcs.Task;
    }
}

И используйте это так:

await xxx.PostAsync(requestUriString, data);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...