2017-09-03 65 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(); 
    } 
}