Search code examples
c#restsharp

client.ExecuteAsync<T> Delegate does not take 1 arguments


I'm trying to change my Restsharp Client to work async instead of sync. Each of my API-Calls referes to the GetAsync<T> method. When I try now to change the Client to call ExecuteAsync<T> instead of Execute i got this error:

Delegate 'Action, RestRequestAsyncHandle>' does not take 1 Arguments

I'm using RestSharp Version 106.6.10 currently.

Here is my GetAsyncMethod:

public async Task<T> GetAsync<T>(string url, Dictionary<string, object> keyValuePairs = null)
    {
        try
        {
            // Check token is expired
            DateTime expires = DateTime.Parse(Account.Properties[".expires"]);
            if (expires < DateTime.Now)
            {
                // Get new Token 
                await GetRefreshTokenAsync();
            }

            // Get AccessToken
            string token = Account.Properties["access_token"];

            if (string.IsNullOrEmpty(token))
                throw new NullReferenceException("AccessToken is null or empty!");

            // Create client
            var client = new RestClient()
            {
                Timeout = 3000000
            };

            //Create Request
            var request = new RestRequest(url, Method.GET);
            request.RequestFormat = DataFormat.Json;
            request.AddHeader("Authorization", "Bearer " + token);

            // Add Parameter when necessary 
            if (keyValuePairs != null)
            {
                foreach (var pair in keyValuePairs)
                {
                    request.AddParameter(pair.Key, pair.Value);
                }
            }
            // Call
            var result = default(T);

            var asyncHandle = client.ExecuteAsync<T>(request, restResponse =>
            {
                // check respone 
                if (restResponse.ResponseStatus == ResponseStatus.Completed)
                {
                    result = restResponse.Data;
                }

                //else
                //    throw new Exception("Call stopped with Status: " + response.StatusCode +
                //                        " Description: " + response.StatusDescription);
            });

            return result;
        }
        catch (Exception ex)
        {
            Crashes.TrackError(ex);
            return default(T);
        }
    }

Here one of the calling Methods:

public async Task<List<UcAudit>> GetAuditByHierarchyID(int hierarchyID)
    {
        string url = AuthSettings.ApiUrl + "/ApiMethod/" + hierarchyID;

        List<UcAudit> auditList = await GetAsync<List<UcAudit>>(url);
        return auditList;
    }

When I Change the T in ExecuteAsync<T> in one of my classes the error is gone. How can I change the method to work async with <T>???


Solution

  • With the info from Lasse Vågsæther Karlsen I found the solution.

    This is the start:

    var asyncHandle = client.ExecuteAsync<T>(request, restResponse =>
            {
                // check respone 
                if (restResponse.ResponseStatus == ResponseStatus.Completed)
                {
                    result = restResponse.Data;
                }
    
                //else
                //    throw new Exception("Call stopped with Status: " + response.StatusCode +
                //                        " Description: " + response.StatusDescription);
            });
    

    Worked for me :

    client.ExecuteAsync<T>(request, (response, asyncHandle )=>
                {
                    //check respone
                    if (response.StatusCode == HttpStatusCode.OK)
                    {
                        result = response.Data;
                    }
                    else
                        throw new Exception("Call stopped with Status: " + response.StatusCode +
                                            " Description: " + response.StatusDescription);
                });
    

    Thank you!