プログラムを中心とした個人的なメモ用のブログです。 タイトルは迷走中。
内容の保証はできませんのであしからずご了承ください。

2018/08/01

ASP.NET Core の非同期コントローラー

event_note2018/07/31 23:18

ASP.NET Core において、Controller を非同期にすることに対していろいろ疑問が湧いたので調べてみました。

CPU バウンド と I/O バウンド

非同期で処理を行うのは、処理に時間がかかるからですが、そこには以下の2つのパターンがあります。

CPU バウンド

単純に計算に時間がかかる処理のことで、CPU に負荷がかかっている状態です。

I/O バウンド

他の Web サーバーや DB サーバーなどに問い合わせを行ったりするなど、外部リソースへのアクセスに時間がかかる処理のことです。

ASP.NET Core における非同期処理

GUI アプリケーションにおいては、UI スレッドを止めないなどの理由で非同期処理を行います。

しかし、ASP.NET では理由は異なり、スレッドプールスレッドを解放し、スループットを向上させることが目的のようです。

リクエストはスレッドプールスレッドで処理される

ASP.NET の記事ですが、HTTP リクエストに対する処理はスレッドプールから割り当てられたスレッドで処理されるそうです。

確証はありませんが、ASP.NET Core も同じなのではないかと思います。

Task.Run もスレッドプールスレッドで処理される

Task.Run を使用した場合もスレッドプールから割り当てられたスレッドで処理されます。

リクエスト処理スレッドでは Task.Run してはいけない

以上より、リクエスト処理中に Task.Run により処理を非同期にしても、スレッドプールスレッドを占有してしまうことは変わりなく、寧ろスレッドの切り替え処理が入ることによるマイナス面しかないため、Task.Run は使用してはいけない、ということのようです。

非同期コントローラーはいつ使用する?

以上を踏まえた上で、非同期コントローラーは I/O バウンドのときに使用するのが最も有効です。

じゃあ CPU バウンドな処理を行いたい場合は?

調査中。
そもそもそんな処理をサーバーでやってはいけないのかもしれませんが・・・。