質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
ASP.NET Web API

ASP.NET Web APIはブラウザやモバイル機器のようなクライアント向けのHTTPサービスを構築するフレームワークです。Microsoft .NET Frameworkがベースになっており、RESTfulサービスを構築するには理想的です。

Q&A

1回答

4540閲覧

APIコントローラ内での非同期メソッドの同期

yoshin

総合スコア39

ASP.NET Web API

ASP.NET Web APIはブラウザやモバイル機器のようなクライアント向けのHTTPサービスを構築するフレームワークです。Microsoft .NET Frameworkがベースになっており、RESTfulサービスを構築するには理想的です。

0グッド

0クリップ

投稿2016/10/03 11:12

編集2016/10/21 05:27

###前提・実現したいこと
ASP.NET MVC5の環境でWebアプリケーションを制作しています。

以下の流れで、サーバーサイドからクライアントへデータを返そうとしています。

1.外部のAPIにアクセスしてデータを取得
2.取得したデータから任意のデータIDを抽出
3.データIDと一致するデータをローカルDBから取得する
4.3の結果をAPIコントローラーを利用してクライアントへ返す

###発生している問題・エラーメッセージ

以下のソースコードを書きましたが、
デバックしたところ、Taskの完了待ち以降の処理に移りません。

非同期メソッドの完了をまってから、次の処理を実行したい場合、私のコードではそもそも考え方が違ったりするのでしょうか?

###該当のソースコード

///////////////////////////////////////////////////////////////
4.3の結果をAPIコントローラーを利用してクライアントへ返す
///////////////////////////////////////////////////////////////

public class AnswerApiController : ApiController { public List<Model> GetModel() { QAManager qam = new QAManager(); //外部のAPIにアクセスしてデータを取得 //取得したデータから任意のデータIDを抽出 qam.ContactAPI().Wait(); **⇒ここでTask(ContactAPI()メソッド)が完了するのをまってから、次のステートメントへ移りたいです。 そのため、Waitメソッドを実行しているのですが、次のステートメントに移りません。 ** //データIDと一致するデータをローカルDBから取得してセットする qam.CreateModelList(); return qam.ModelList; } }

///////////////////////////////////////////////////////////////
1.外部のAPIにアクセスしてデータを取得
2.取得したデータから任意のデータIDを抽出
3.データIDと一致するデータをローカルDBから取得して返す
以上の3つを実現するクラス
///////////////////////////////////////////////////////////////

public class QAManager { //データID public string DataID {get; set;} //ローカルDBからデータIDと一致するレコードを抽出したデータを保持するリスト public List<自作モデル> ModelList { get; set; } /// <summary> /// 外部のAPIにアクセスしてデータを取得。 /// 取得したデータから任意のデータIDを抽出 /// </summary> public async Task ContactAPI() { var TARGETURL = "https://-------"; HttpClient client = new HttpClient(); //ユーザとパスワードをセットする。 var byteArray = Encoding.ASCII.GetBytes("userID:password"); client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray)); //外部APIから結果を取得 var response = await client.GetAsync(TARGETURL); HttpContent content = response.Content; //このあと 取得したデータから任意のデータIDを抽出する DataID = ----省略----- } /// <summary> /// データIDと一致するデータをローカルDBから取得してセットする /// </summary> public void CreateModelList() { using(myDbContext db = new myDbContext()) { ModelList = db.Answers.Where(x => x.id == DataID).ToList(); } } }

###補足情報(言語/FW/ツール等のバージョンなど)
ASP.NET MVC5

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

そもそも非同期である理由は何でしょうか。
やりたいことは同期処理だと思うのですが…。

投稿2016/10/03 13:17

goute

総合スコア216

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yoshin

2016/10/04 00:15

QAManagerのContactAPI()メソッドのの下記の処理において、 非同期メソッドの完了をまつawaitを使用するために、 ContactAPI()メソッドにasync をつけて非同期にしたというのが理由です。 //外部APIから結果を取得 var response = await client.GetAsync(TARGETURL); コメントいただいたとおり、同期処理で行えればそれで問題ないのですが、 方法がわからなかったというのが正直なところです。
goute

2016/10/07 13:09

お返事遅れてしまいすみません。 ちょっと内容確認してみますが、ひとまずコード部分を```C# ```(編集エリア上部にあるコードボタンでもOK)で囲っていただけると良いかと思います。
yoshin

2016/10/21 05:29

コメントに気づかず申し訳ありません。 ご指摘のとおりコード部分を囲ってみました。 この機能自体しりませんでした。。。教えていただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問