簡體   English   中英

如何同時運行許多異步方法?

[英]How can I run many asynchronous methods all together?

我想同時運行我的異步方法 GetPlayerCountryData() 和 GetPlayerTagsData() 以節省時間,而不是僅在前一個方法完成后才開始下一個方法。 但我不知道該怎么做。

https://jeremylindsayni.wordpress.com/2019/03/11/using-async-await-and-task-whenall-to-improve-the-overall-speed-of-your-c-code/

我已閱讀本教程,但我不知道如何在我的代碼中使用 await Task.WhenAll()。

另外,我想執行這行 AllMethodsCompleted = true; 畢竟我的所有異步方法都已成功完成。 在這種情況下我應該使用 await Task.WhenAll() 嗎?

如果我的所有異步方法都成功完成,我如何才能設置 AllMethodsCompleted = true ? 是否可以在設置 AllMethodsCompleted = true 之前找出 (result.Error?= null) 或其中一個異步方法中是否發生異常?

string PlayerDeviceId = "";

private void RegisterGuestPlayFabAccount()
{
    PlayerDeviceId = ReturnMobileID();
    var requestIOS = new LoginWithIOSDeviceIDRequest { DeviceId = PlayerDeviceId, CreateAccount = true };
    var loginTask = PlayFabClientAPI.LoginWithIOSDeviceIDAsync(requestIOS);
    loginTask.ContinueWith(OnPlayFabRegisterGuestAccountComplete);
}

private void OnPlayFabRegisterGuestAccountComplete(Task<PlayFabResult<LoginResult>> task)
{
    if (task.Result.Result != null)
    {
        PlayerAccountDetails();
    }

    if (task.Result.Error != null)
    {
        OnPlayFabError(task.Result.Error);
    }
}

 bool AllMethodsCompleted = false;

 public async void PlayerAccountDetails()
 {
     await GetPlayerCountryData();
     await GetPlayerTagsData();
     AllMethodsCompleted = true;
 }

 private async Task GetPlayerTagsData()
 {
     var resultprofile = await PlayFabServerAPI.GetPlayerTagsAsync(new PlayFab.ServerModels.GetPlayerTagsRequest()
     {
         PlayFabId = PlayerPlayFabID
     });

     if (resultprofile.Error != null)
         OnPlayFabError(result.Error);
     else
     {
         if ((resultprofile.Result != null) && (resultprofile.Result.Tags.Count() > 0))
             CurrentPlayerTag = resultprofile.Result.Tags[0].ToString();
     }
 }

 private async Task GetPlayerCountryData()
 {
     var resultprofile = await PlayFabClientAPI.GetUserDataAsync(new PlayFab.ClientModels.GetUserDataRequest()
     {
         PlayFabId = PlayerPlayFabID,
         Keys = null
     });

     if (resultprofile.Error != null)
         OnPlayFabError(result.Error);
     else
     {
         if (resultprofile.Result.Data == null || !resultprofile.Result.Data.ContainsKey("Country") || !resultprofile.Result.Data.ContainsKey("City"))
             Console.WriteLine("No Country/City");
         else
         {
             PlayerCountry = resultprofile.Result.Data["Country"].Value);
             PlayerCity = resultprofile.Result.Data["City"].Value);
         }
     }
 }
public async Task PlayerAccountDetails()
{ 
    var playerCountryData = GetPlayerCountryData());
    var playerTagsData = GetPlayerTagsData());        

    await Task.WhenAll(playerCountryData, playerTagsData);
    AllMethodsCompleted = true;
}

這是您正在查詢的方法,並以異步方式運行這 2 個方法,等待每個方法完成然后繼續。 他們只需要分配給一個任務變量。

暫無
暫無

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

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