Как получить индивидуальный ответ об успешном статусе вызова API в C # - PullRequest
0 голосов
/ 03 июня 2019

Как получить ответ об успешном статусе отдельного вызова API в C #.

Я создаю мобильное приложение с использованием форм Xamarin,

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

Прямо сейчас, я называю детали, как это,

    public async Task<Response> GetAllVasInformationAsync()
    {
        var userDetails = GetUserDetailsAsync();
        var getWageInfo = GetUserWageInfoAsync();
        var getSalaryInfo = GetSalaryInfoAsync();


        await Task.WhenAll(userDetails,
            getWageInfo,
            getSalaryInfo,
          );

        var resultToReturn = new Response
        {
            IsuserDetailsSucceeded = userDetails.Result,
            IsgetWageInfoSucceeded = getWageInfo.Result,
            IsgetSalaryInfoSucceeded = getSalaryInfo.Result,
        };

        return resultToReturn;
    }

В моем приложении мне нужно обновить детали, основываясь на успешном ответе. Как то так (2/5) завершено. И текст должен обновляться всякий раз, когда мы получаем новый ответ.

Каков наилучший способ реализации этой функции? Можно ли использовать вместе с Task.WhenAll. Потому что я пытаюсь обернуть все в один вызов метода.

Ответы [ 4 ]

4 голосов
/ 03 июня 2019

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

Правильный способ сделать это - IProgress<string>.Вызывающий код должен предоставлять Progress<string>, который соответствующим образом обновляет пользовательский интерфейс.

public async Task<Response> GetAllVasInformationAsync(IProgress<string> progress)
{
  var userDetails = UpdateWhenComplete(GetUserDetailsAsync(), "user details");
  var getWageInfo = UpdateWhenComplete(GetUserWageInfoAsync(), "wage information");
  var getSalaryInfo = UpdateWhenComplete(GetSalaryInfoAsync(), "salary information");

  await Task.WhenAll(userDetails, getWageInfo, getSalaryInfo);

  return new Response
  {
    IsuserDetailsSucceeded = await userDetails,
    IsgetWageInfoSucceeded = await getWageInfo,
    IsgetSalaryInfoSucceeded = await getSalaryInfo,
  };

  async Task<T> UpdateWhenComplete<T>(Task<T> task, string taskName)
  {
    try { return await task; }
    finally { progress?.Report($"Completed {taskName}"); }
  }
}

Если вам также нужен счетчик, вы можете либо использовать IProgress<(int, string)>, либо изменить способ построения строки прогресса отчета, чтобы включитьсосчитать.

2 голосов
/ 03 июня 2019

Итак, вот что я бы сделал в C # 8 и .NET Standard 2.1 :

Сначала я создаю метод, который будет производить перечисление async:

static async IAsyncEnumerable<bool> TasksToPerform() {
    Task[] tasks = new Task[3] { userDetails, getWageInfo, getSalaryInfo };

    for (i = 0; i < tasks.Length; i++) {
        await tasks[i];
        yield return true;
    }
}

Так что теперь вам нужно ждать foreach по этой задаче. Каждый раз, когда вы получаете возврат, вы знаете, что задание выполнено.

int numberOfFinishedTasks = 0;

await foreach (var b in TasksToPerform()) {
    numberOfFinishedTasks++;
    //Update UI here to reflect the finished task number
}
1 голос
/ 03 июня 2019

Не нужно слишком усложнять это.Этот код покажет, сколько из ваших задач имели исключения.Ваша задача ожидания. Когда они просто запускаются и ждут их завершения.Поэтому после этого вы можете делать все, что вы хотите с задачами:)

var task = Task.Delay(300);
var tasks = new List<Task> { task };
var faultedTasks = 0;

tasks.ForEach(t =>
{
     t.ContinueWith(t2 =>
     {
          //do something with a field / property holding ViewModel state
          //that your view is listening to
     });
});

await Task.WhenAll(tasks);

//use this to respond with a finished count
tasks.ForEach(_ => { if (_.IsFaulted) faultedTasks++; });

Console.WriteLine($"{tasks.Count() - faultedTasks} / {tasks.Count()} completed.");

1 голос
/ 03 июня 2019

.WhenAll() позволит вам определить, если / любой / из задач не удалось, они просто подсчитать задачи, которые не удалось.

public async Task<Response> GetAllVasInformationAsync()
{
    var userDetails = GetUserDetailsAsync();
    var getWageInfo = GetUserWageInfoAsync();
    var getSalaryInfo = GetSalaryInfoAsync();


    await Task.WhenAll(userDetails, getWaitInfo, getSalaryInfo)
       .ContinueWith((task) =>
       {
          if(task.IsFaulted)
          { 
             int failedCount = 0;
             if(userDetails.IsFaulted) failedCount++;
             if(getWaitInfo.IsFaulted) failedCount++;
             if(getSalaryInfo.IsFaulted) failedCount++;
             return $"{failedCount} tasks failed";
          }
    });

    var resultToReturn = new Response
    {
        IsuserDetailsSucceeded = userDetails.Result,
        IsgetWageInfoSucceeded = getWageInfo.Result,
        IsgetSalaryInfoSucceeded = getSalaryInfo.Result,
    };

    return resultToReturn;
}
...