2017-09-03 12 views
4

私のアプリケーションからSMSを送信したい。特定のURLにget要求を送信すると、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

、あなたのタスクを待ちたくない場合は、あなたが

await SendMessage().ConfigureAwait(false); 

like-別の方法からSendMessageを呼び出すことができ、不要な戻り値の型次に

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

     } 
    } 
} 

を削除することができます:タスクが正常に完了したかどうかわからないので、これはお勧めしません。

あなたが望むものを達成するための方法はまだまだあります。あなたはあなたのコードのどこかに、良いアイデアではありません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(); 
    } 
} 
関連する問題