簡體   English   中英

如何在C#中獲取單個API調用狀態成功響應

[英]How to get the individual API call status success response in C#

如何在C#中獲取單個API調用狀態成功響應。

我正在使用Xamarin Forms創建移動應用程序,

在我的應用程序中,我需要在啟動應用程序以使用移動應用程序時預取某些信息。

現在,我這樣稱呼細節,

    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一起使用。 因為我試圖將所有內容包裝在一個方法調用中。

在我的應用中,我需要根據成功響應來更新詳細信息。

正確的方法是IProgress<string> 調用代碼應提供一個Progress<string> ,以相應地更新UI。

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)>或更改構建報告進度字符串以包括計數的方式。

所以這就是我在C#8.NET Standard 2.1中要做的事情:

首先,我創建將產生異步可枚舉的方法:

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;
    }
}

所以現在您需要等待這個枚舉任務。 每當您獲得回報時,您就知道任務已經完成。

int numberOfFinishedTasks = 0;

await foreach (var b in TasksToPerform()) {
    numberOfFinishedTasks++;
    //Update UI here to reflect the finished task number
}

.WhenAll()將允許您確定/ any /任務是否失敗,您只需計算失敗的任務即可。

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;
}

無需過於復雜。 該代碼將顯示您的任務中有多少例外。 您的await task.whenall會觸發它們並等待它們完成。 因此,在那之后您就可以執行任務:)

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.");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM