SMART LLC

非同期メソッドを同期させる方法(.NET)

公開日:2015/07/07

.NETアプリケーションでPOSTデータを送受信する方法で使った非同期メソッドの続き。
POST待ちの間に別の処理をする場合はPostAsyncメソッドの非同期はありがたいけど逆に同期させたくて困った。
非同期メソッドを同期させる方法がわかったのでメモする。

非同期メソッドを同期させる方法

修正前。Awaitをつけて別スレッドで待機させてた。

Dim res As HttpResponseMessage = Await hc.PostAsync(url, data)
MsgBox(Await res.Content.ReadAsStringAsync)

修正後。AwaitをつけないでTaskオブジェクトで受け取ってみた。

Dim postTask As Task(Of HttpResponseMessage) = hc.PostAsync(url, data)
postTask.Wait()
Dim res As HttpResponseMessage = postTask.Result
Dim readTask As Task(Of String) = res.Content.ReadAsStringAsync
readTask.Wait()
MsgBox(readTask.Result)

Taskクラスに実行が完了するまで待機するWaitメソッドがあることに気付いてやってみた。
PostAsyncメソッドもReadAsStringAsyncメソッドもAwaitをつけないとTaskクラスを返すからそれぞれTaskオブジェクトを用意して受け取る。
あとはWaitメソッドで完了するまで待機した後Resultプロパティに格納される結果を取り出して利用する。
できたー(∩´∀`)∩非同期メソッドの意味なーし
そして試してないけどResultプロパティ読むとWaitなしでいきなりResultにアクセスしても待機してくれそう。
でもまあWaitて待機させる専用のメソッドがあるんだから使うけど。
Await書かなくなったから自身(メソッド)の宣言時にAsyncて修飾してたのもいらなくなりましたとさ。

現在進行中の案件が2つ、見積もり出してる案件が3つ、近いうち見積もり依頼きそうな案件が2つある。
全部発注もらえたら嬉しいけどタイミングによっては最悪4つ5つ並行で進行するかもしれないという…
かかってこい_(:3 」∠)_

SHARE