web-dev-qa-db-fra.com

Utiliser async sans attendre quand je n'ai pas besoin de réponse

Je veux envoyer un SMS depuis mon application. SMS sera envoyé lorsque j'enverrai une demande d'extraction à une URL spécifique. Toutes mes méthodes sont asynchrones, mais lorsque j’ai utilisé une HttpClient et que je veux utiliser response.Content.ReadAsStringAsync(), j’ai supprimé await.

Je ne veux pas attendre la réponse de cette méthode et je veux envoyer une requête à cette URL uniquement. Maintenant, pouvez-vous me dire que c'est une bonne solution?

Ceci est mon exemple de code:

public async Task<bool> SendMessage(string number, string body)
{
    var from = _config["SMSSenderSettings:FromNumber"];
        var username = _config["SMSSenderSettings:PanelUserName"];
        var password = _config["SMSSenderSettings:PanelPassword"];

        using (var client = new HttpClient())
        {
            try
            {
                var response = await client.GetAsync($"{BaseUrl}/send.php?method=sendsms&format=json&from={from}" +
                    $"&to={number}&text={body}&type=0&username={username}&password={password}");
                response.EnsureSuccessStatusCode(); // Throw exception if call is not successful

                response.Content.ReadAsStringAsync();
                return true;
            }
            catch (HttpRequestException)
            {
                return false;
            }
        }
}

J'ai supprimé await de response.Content.ReadAsStringAsync(); et je reçois un avertissement.

7

Si vous ne souhaitez pas attendre votre tâche, vous pouvez supprimer le type de retour indésirable.

public async Task SendMessage(string number, string body)
{
    var from = _config["SMSSenderSettings:FromNumber"];
    var username = _config["SMSSenderSettings:PanelUserName"];
    var password = _config["SMSSenderSettings:PanelPassword"];

    using (var client = new HttpClient())
    {
        try
        {
            var response = await client.GetAsync($"{BaseUrl}/send.php?method=sendsms&format=json&from={from}" +
                $"&to={number}&text={body}&type=0&username={username}&password={password}");
            response.EnsureSuccessStatusCode(); // Throw exception if call is not successful

            await response.Content.ReadAsStringAsync();
        }
        catch (HttpRequestException)
        {

        }
    }
}

Ensuite, vous pouvez appeler la SendMessage depuis une autre méthode comme-

await SendMessage().ConfigureAwait(false);

Note : Ceci n'est pas recommandé car vous ne saurez pas si votre tâche se termine avec succès ou non.

Il y a encore d'autres moyens de réaliser ce que vous voulez. Vous pourriez en lire quelques-uns-

Comment exécuter une tâche asynchrone sans avoir besoin d'attendre le résultat dans la fonction/thread en cours?

Comment appeler une méthode asynchrone en C # sans attendre

4
Souvik Ghosh

Ce n'est pas une bonne idée. Quelque part dans votre code, vous devriez await/Wait/.Result la Task, sinon les exceptions non gérées produiront jusqu'au niveau de l'application voir docs

C'est le radon pour l'avertissement, le compilateur ne veut pas vous laisser vous tirer une balle dans le pied. Si vous voulez vraiment aller de l'avant avec cela, placez simplement la tâche dans une variable et ne l'utilisez jamais, bien que d'autres outils d'analyse statique puissent le signaler.

var t = response.Content.ReadAsStringAsync();

Ou si l'appel n'est pas nécessaire pour compléter la demande, vous pouvez envisager de le supprimer complètement.

Si le contenu de la réponse n'est pas nécessaire, ne le lisez pas du tout. Et vous ne devriez pas jeter d'exceptions, quand vous pouvez les éviter.

Avec cela, vous pouvez avoir un code beaucoup plus propre

public async Task<bool> SendMessage(string number, string body)
{
    var from = _config["SMSSenderSettings:FromNumber"];
    var username = _config["SMSSenderSettings:PanelUserName"];
    var password = _config["SMSSenderSettings:PanelPassword"];

    using (var client = new HttpClient())
    {
        var response = await client.GetAsync($"{BaseUrl}/send.php?method=sendsms&format=json&from={from}" +
            $"&to={number}&text={body}&type=0&username={username}&password={password}");
        return response.IsSuccessStatusCode();
    }
}
0
Sir Rufo