2017-09-03 64 views
4

我想从我的应用发送短信。当我向特定URL发送获取请求时,SMS会发送。我所有的方法都是异步的,但是当我实例化一个HttpClient并且想要使用response.Content.ReadAsStringAsync()时,我删除了await当我不需要响应时,无需等待即可使用异步

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

这是我的示例代码:

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; 
      } 
     } 
} 

我从response.Content.ReadAsStringAsync();删除await,我也得到警告。

+2

这不是一个好主意,在某处你的代码,你应该'await' /'Wait' /'.Result'任务,否则任何未处理的异常将升至应用程序级别https://docs.microsoft.com/en-us/dotnet/standard/parallel-programming/exception-handling-task-parallel-library –

+0

如果您不需要该内容,则不要阅读内容。只要删除整条线。 –

回答

3

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

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

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

还有其他的方法可以实现你想要的。你可能会读几these-

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

谢谢@Souvik,ConfigureAwait(false)是我需要的。我读过你介绍的线索,但他们不是我的。 –

+0

@HusseinJahanbakhsh很高兴为你工作。 –

2

这不是一个好主意,在某处你的代码,你应该await/Wait/.ResultTask否则任何未处理的异常将提高到应用程序级别见docs

这就是氡的警告,编译器不想让你自己拍摄脚。如果您真的想继续这样做,只需将任务放入一个变量中,而不要使用它,尽管其他静态分析工具可能会标记这一点。

var t = response.Content.ReadAsStringAsync(); 

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

+0

谢谢@Titian Cernicova-Dragomir,但如果我删除这一行,请求永远不会发送到URL。 –

0

如果不需要响应内容,则根本不要读取内容。当你可以避免时,你不应该抛出异常。

有了,你可以有一个更清洁的代码

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(); 
    } 
}