none
windowsアプリ内での同期通信について RRS feed

  • 質問

  • お世話になります。

    C#にてアプリの開発を行っています。

    アプリ内で同期通信を行い通信が成功した場合に、画面遷移を行いたいと考えています。

    HttpClientでの通信処理はうまくいくのですが、通信が終わる前に画面遷移してしまいます。

    上記問題を解決する為の方法をご教授いただけないでしょうか?

    下記の用に通信用のメソッドを用意して、呼び出す用にしています

    async private void foo() {
    var client = new HttpClient(); 
    var response = await client.GetAsync(new Uri("http://www.hogehoge.com"));
    var result = await response.Content.ReadAsStringAsync();

    }


    2014年7月8日 10:44

回答

  • async void メソッドを呼び出しても呼び出した側がメソッドの完了を待機してくれません。Taskを返すようにして、呼び出し側はawait で待機するようにしてみてください。

    private  async Task Foo() {
        var client = new HttpClient(); 
        var response = await client.GetAsync(new Uri("http://www.hogehoge.com"));
        var result = await response.Content.ReadAsStringAsync();
    }
    
    //呼び出すメソッド
    private await void Test() {
        await Foo();
        //画面遷移する
    }

    async Task ではなく async void ですと、例外処理も難しくなるため、イベントハンドラを実装する目的以外でasync void を使うのは強くおすすめしません。

    詳細が気になる場合はこちらの記事などをご覧ください。

    MSDN マガジン March 2013 > Async/Await - 非同期プログラミングのベスト プラクティス

    ※ Testメソッドにawait を追加しました

    • 編集済み tanaka_733MVP 2014年7月9日 2:15 コードが間違っていたため
    • 回答としてマーク hoshi2199 2014年7月9日 3:40
    2014年7月8日 11:25
    • asyncの付いているメソッドを利用する場合は常にawaitを付けてください。
    • その上で、メソッド内にawaitを書きたい場合はそのメソッドにasyncを付けてください。
    • これらを再帰的に繰り返してください。

    です。

    • 回答としてマーク hoshi2199 2014年7月9日 3:40
    2014年7月8日 22:57

すべての返信

  • async void メソッドを呼び出しても呼び出した側がメソッドの完了を待機してくれません。Taskを返すようにして、呼び出し側はawait で待機するようにしてみてください。

    private  async Task Foo() {
        var client = new HttpClient(); 
        var response = await client.GetAsync(new Uri("http://www.hogehoge.com"));
        var result = await response.Content.ReadAsStringAsync();
    }
    
    //呼び出すメソッド
    private await void Test() {
        await Foo();
        //画面遷移する
    }

    async Task ではなく async void ですと、例外処理も難しくなるため、イベントハンドラを実装する目的以外でasync void を使うのは強くおすすめしません。

    詳細が気になる場合はこちらの記事などをご覧ください。

    MSDN マガジン March 2013 > Async/Await - 非同期プログラミングのベスト プラクティス

    ※ Testメソッドにawait を追加しました

    • 編集済み tanaka_733MVP 2014年7月9日 2:15 コードが間違っていたため
    • 回答としてマーク hoshi2199 2014年7月9日 3:40
    2014年7月8日 11:25
  • 上記の方法を試してみたのですが、呼び出し元のメソッドにasync修飾子を付ける為、シュミレーターを実行する際に

    「修飾子”async”がこの項目に対して有効ではありません」と怒られてしまいました。

    上記方法がだめだとすると HttpClient以外のWebSocketなどを使った方がいいのでしょうか。

    2014年7月8日 11:42
    • asyncの付いているメソッドを利用する場合は常にawaitを付けてください。
    • その上で、メソッド内にawaitを書きたい場合はそのメソッドにasyncを付けてください。
    • これらを再帰的に繰り返してください。

    です。

    • 回答としてマーク hoshi2199 2014年7月9日 3:40
    2014年7月8日 22:57
    • asyncの付いているメソッドを利用する場合は常にawaitを付けてください。
    • その上で、メソッド内にawaitを書きたい場合はそのメソッドにasyncを付けてください。
    • これらを再帰的に繰り返してください。

    です。

    その通りです。コードが間違っていました(修正済み)。ご指摘ありがとうございます。

    2014年7月9日 2:17
  • ご回答ありがとうございます。
    2014年7月9日 3:40