2017-10-22 4 views
0

私はrestとAzure SQLデータベースを使用する単純なC#アプリケーションを開発しています。私のアプリには、新しい名前を保存するためのボタンと、新しい名前を保存するための2つのボタンがあります。私はそれを押したときに、後には反応せず、この呼び出しを待つされていないので、私はこれらの部品GetRequest();PostRequest(jsonPost);HttpClientでのエラー

 private void Btn_Click(object sender, EventArgs e) 
     { 
      GetRequest(); 
     } 

     private void Btn_Click(object sender, EventArgs e) 
     { 
      User user = new User(0, firstnameText.Text); 
      JavaScriptSerializer java = new JavaScriptSerializer(); 
      String jsonPost = java.Serialize(user); 

      PostRequest(jsonPost); 
     } 
    } 

重大度コード説明プロジェクトファイルの行の抑制状態の詳細説明 警告CS4014に関連する次のエラーを取得します呼び出しが完了する前に、現在のメソッドの実行が継続されます。呼び出しの結果に 'await'演算子を適用することを検討してください。現在のメソッドは、タスクまたはタスクを返す非同期メソッドを呼び出し、結果にawait演算子を適用しません。 asyncメソッドを呼び出すと、非同期タスクが開始されます。ただし、オペレータ待ち時間がないため、タスクが完了するのを待たずにプログラムが続行されます。ほとんどの場合、その動作は期待どおりではありません。通常、呼び出しメソッドの他の側面は呼び出しの結果に依存しますが、呼び出されたメソッドは、呼び出しを含むメソッドから戻る前に完了する必要があります。

同様に重要な問題は、呼び出された非同期メソッドで発生する例外がどうなるかです。タスクまたはタスクを返すメソッドで発生した例外は、返されたタスクに格納されます。タスクを待機していないか、または例外を明示的にチェックしていない場合、例外は失われます。タスクを待っている場合、その例外は再スローされます。

ベストプラクティスとして、常にコールを待つ必要があります。

非同期呼び出しが完了するのを待たずに、呼び出されたメソッドが例外を発生させないことが確実な場合にのみ、警告を抑制することを検討する必要があります。その場合、呼び出しのタスク結果を変数に代入することによって、警告を抑制することができます。

答えて

2

タスクは非同期メソッドから常に返されますが、これはUIイベントハンドラでは不可能です。そのため、あなたはこのようなあなたのハンドラを書き換える必要があります。

private async void Button1_Click(object sender, EventArgs e) 
{ 
    await GetRequest(); 
} 

private async void Button2_Click(object sender, EventArgs e) 
{ 
     Person p = new Person(0, nameText.Text); 
     JavaScriptSerializer js = new JavaScriptSerializer(); 
     String jsonPost = js.Serialize(p); 

     await PostRequest(jsonPost); 
} 

は、詳細はhereを参照してください。

また、脇に、アプリケーション全体のHttpClientの静的インスタンスを1つ宣言する必要があります(MSDN docsなど)。

+1

[ここ](https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/)は、HttpClientの問題の詳細な説明です。 –