C#では、メソッドをオーバーライドするときに、元のメソッドがオーバーライドしていなかった場合にオーバーライドを非同期にすることが許可されています。これは貧弱な形のようです。
私にこれをもたらした例はこれでした-私は、負荷テストの問題を支援するために連れてこられました。同時ユーザー数が約500の場合、ログインプロセスはリダイレクトループになります。IISは、「非同期操作がまだ保留中に非同期モジュールまたはハンドラーが完了しました」というメッセージで例外を記録していました。一部の検索では、誰かが悪用していると思うようになりましたがasync void
、ソースをすばやく検索しても何も見つかりませんでした。
悲しいことに、「async \ s [^ T]」のようなものを探すべきだったときに、「async \ svoid」(正規表現検索)を探していました(タスクが完全に修飾されていないと仮定すると...ポイントが得られます)。
後で見つけたのasync override void onActionExecuting(...
は、ベースコントローラーです。明らかにそれが問題にならなければなりませんでした。これを修正することで(現時点では同期化することで)問題は解決しました。
質問に戻る:なぜ、呼び出し元のコードがそれを待つことができないのに、なぜオーバーライドを非同期としてマークできるのでしょうか?
Task
ます。