当我不需要响应时,请使用async而不等待

时间:2017-09-03 08:31:02

标签: c# async-await

我想从我的应用发送短信。当我将get请求发送到特定URL时,SMS将发送。我的所有方法都是异步的,但当我实例response.Content.ReadAsStringAsync()并希望使用await时,我删除了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; } } }

我不想等待此方法的响应,并且只想向该网址发送请求。现在你能告诉我这是一个很好的解决方案吗?

这是我的示例代码:

await

我从response.Content.ReadAsStringAsync();删除了{{1}},然后收到警告。

3 个答案:

答案 0 :(得分:4)

如果您不想等待任务,可以删除不需要的返回类型

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)
        {

        }
    }
}

然后你可以从另一种方法调用SendMessage,如 -

await SendMessage().ConfigureAwait(false);

注意:建议您不要这样做,因为您不知道您的任务是否成功完成。

还有其他方法可以达到你想要的效果。您可能会阅读其中的一些 -

How to run async task without need to await for result in current function/thread?

How to safely call an async method in C# without await

答案 1 :(得分:3)

这不是一个好主意,在您的代码中的某个位置{/ 1}} / await / Wait .Result否则任何未处理的异常都会升级到应用程序级别见docs

那是警告的氡,编译器不想让你在脚下射击。如果你真的想继续这样做,只需将任务放在变量中,永远不要使用它,尽管其他静态分析工具可能会标记这一点。

Task

或者如果完成请求不需要调用,您可以考虑完全删除它。

答案 2 :(得分:0)

如果不需要响应内容,请不要阅读内容。当你可以避免它时,你不应该抛出异常。

通过它,您可以拥有更清晰的代码

A[_<:S]