How can I cancel an asynchronous task when it takes very long to complete it or if it will probably never complete? Is it possible to use a given time(for example 10 seconds) for each task and when it doesn't complete in this given time, then the task will automatically be cancelled?
Is it possible to restart a task or create the same task again after it failed? What can I do if one of the tasks in a task list fails? Is it possible to only restart the failed task?
In my code, playerCountryDataUpdate should only be executed after each task in TasksList1 completed without error or exception. I want to restart a task when it fails. When the same task fails again, then don't restart it and display an error message on the screen. How can I do that?
bool AllMethods1Completed = false;
bool AllMethods2Completed = false;
public async Task PlayerAccountDetails()
{
    var playerCountryDataGet = GetPlayerCountryData();
    var playerTagsData = GetPlayerTagsData();
    var TasksList1 = new List<Task> { playerCountryDataGet, playerTagsData };
    try
    {
        await Task.WhenAll(TasksList1);
        AllMethods1Completed = true;
    }
    catch
    {
        AllMethods1Completed = false;
    }
    if (AllMethods1Completed == true)
    {
        var playerCountryDataUpdate = UpdatePlayerCountryData("Germany", "Berlin");
        var TasksList2 = new List<Task> { playerCountryDataUpdate };
        try
        {
            await Task.WhenAll(TasksList2);
            AllMethods2Completed = true;
        }
        catch
        {
            AllMethods2Completed = false;
        }
    }
}
private async Task GetPlayerTagsData()
{
    var resultprofile = await PlayFabServerAPI.GetPlayerTagsAsync(new PlayFab.ServerModels.GetPlayerTagsRequest()
    {
        PlayFabId = PlayerPlayFabID
    });
    if (resultprofile.Error != null)
        Console.WriteLine(resultprofile.Error.GenerateErrorReport());
    else
    {
        if ((resultprofile.Result != null) && (resultprofile.Result.Tags.Count() > 0))
            PlayerTag = 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)
        Console.WriteLine(resultprofile.Error.GenerateErrorReport());
    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;
        }
    }
}
private async Task UpdatePlayerCountryData(string country, string city)
{
    var resultprofile = await PlayFabClientAPI.UpdateUserDataAsync(new PlayFab.ClientModels.UpdateUserDataRequest()
    {
        Data = new Dictionary<string, string>() {
            {"Country", country},
            {"City", city}
            },
        Permission = PlayFab.ClientModels.UserDataPermission.Public
    });
    if (resultprofile.Error != null)
        Console.WriteLine(resultprofile.Error.GenerateErrorReport());
    else
        Console.WriteLine("Successfully updated user data");
}
 
     
    