[Solved] .NET CORE Time asynced method


When an asynchronous method starts getting complicated it’s a sure sign something is wrong. Most of the time async code looks almost the same as synchronous code with the addition of await.

A simple polling loop could be as simple as :

public async Task<string> waitForCampaignLoadAsync(string uri)
{
    var client=new HttpClient();
    for(int i=0;i<30;i++)
    {
        token.ThrowIfCancellationRequested();
        var json = await client.GetStringAsync(uri);
        var container = JsonConvert.DeserializeObject<CampaignTempleteStatus>(json);
        if (container.status != "pending")
        {
            return container.status;
        }
        await Task.Delay(10000); 
    }
    return "Timed out!";
}

Cancellation in managed threads explains how CancellationTokenSource and CancellationToken can be used to cancel threads, tasks and asynchronous functions. Many asynchronous methods already provide overloads that accept a CancellationToken parameter. The polling function could be modified to accept and check a canellation token :

public async Task<string> waitForCampaignLoadAsync(string uri,CancellationToken token=default)
{
    var client=new HttpClient();
    for(int i=0;i<30;i++)
    {
        var json = await client.GetStringAsync(uri);
        var container = JsonConvert.DeserializeObject<CampaignTempleteStatus>(json);
        if (container.status != "pending")
        {
            return container.status;
        }
        await Task.Delay(10000,token); 
    }
    return "Timed out!";
}

A CancellationTokenSource can be used to call this method with an overall timeout of eg, 5 minutes :

 var cts=new CancellationTokenSource(TimeSpan.FromMinutes(5));
 try
 {
     var result=waitForCampaignLoadAsync(uri,cts.Token);
     //Process the result ....
 }
 catch(OperationCancelledExcepction ex)
 {
     //Handle the timeout here
 }

This code can be improved. For example, GetStringAsync() doesn’t accept a cancellation token. The operation can be broken in two steps though, one call to GetAsync() with a cancellation token that waits for the server to send a result
and another to HttpContent.ReadAsStringAsync() to read the response, eg :

var response=await client.GetAsync(uri,token)
response.EnsureSuccessStatusCode();
var json=await response.Content.ReadAsStringAsync();
...

solved .NET CORE Time asynced method