長時間実行される操作では、asp.netスレッドがサーバーの他の要求に解放されている場合。どのスレッドで長期実行操作が実行され、完了時にasp.netスレッドを獲得する方法ASP.NETでのスレッドの処理Async操作の待機時間
4
A
答えて
6
私のブログで説明しているように、long-running I/O operations do not require a thread at all。むしろ、スレッドを必要としない自然に非同期のI/Oを使用します。
デバイスドライバは一般にDMAを使用します。これにより、デバイスはメインシステムRAMから直接読み書きできます。 .NETは、スレッドプールの一部であるIOCP(I/O Completion Port)を使用してこのアプローチを補完し、膨大な数のI/O操作を待つappdomainごとに1つのスレッド(または非常に少数のスレッド)を許可します。
は、あなたの質問の後半、非同期メソッドに答えるために ますリクエストコンテキストと履歴書、それ たり、それがawait
前にあった同じスレッド上にないかもしれません。より一般的なシナリオは、I/O操作が完了したときにIOCPに通知します.IOCPは、スレッドプールスレッドを使用してタスクを完了したことなどをマークし、その後、同じスレッドがASP.NETに入りますコンテキストを要求し、ハンドラの実行を再開します。これは
ではありません。常にが発生します。スレッドスイッチが必要な場合もありますが、最も一般的なケースです。
1
質問に答えるために、すべてのスレッドはスレッドプールから取得されます。
このようなシナリオの例は、サーバーから要求を受け取ったときに、利用可能なスレッドをプールから引き出して要求を処理します。
次に、新しいスレッドを作成します(Async
またはその他の手段のいずれか)。新しいスレッドがプールから引き出され、Async
ボディのリクエストが実行されます。
一方、元のスレッドはプールに解放され、別の要求を処理するために戻ります。
スレッドが終了すると、プールから別のスレッド(元のスレッドと同じでない可能性があります)をフェッチして、要求を完了します。
1つのスレッド(同一プールのスレッド)をブロックしているため、このプロセスがCPUにバインドされていると、時間が無駄です。ただし、IOバインド操作はスレッドを使用しないため、このように処理できます。
関連する問題
- 1. asp.netでの作業時間の処理
- 2. TPLとasync/await(スレッド処理)の違い
- 3. 処理時間の後のASP.NET応答
- 4. 待機操作のタイムアウト
- 5. asp.net Webフォームリクエスト処理でのスレッド化
- 6. pythonがイベント処理スレッドでビジー待機を避ける
- 7. SVMでの処理時間
- 8. if文の処理、操作
- 9. HibernateとMySQL InnoDBを使用した待機中のスレッドでのGrailsセッション処理
- 10. 多くの時間を要する関数の処理スレッド化
- 11. プロファイラ出力のスレッド同時処理オーバーヘッド時間の意味は何ですか?
- 12. 時間帯の処理時間
- 13. Swift:解析クエリの待ち時間を処理する方法
- 14. サーブレットの作業中に中間(待機/処理)ページを設定する方法
- 15. ASP.NET async /パート2を待つ
- 16. ブラックベリー(Java)のスレッド間制御処理
- 17. 時間単位の操作
- 18. ルビーの時間操作
- 19. .NET待機タスク(async/await)
- 20. 待ち時間の少ないスレッドを待つ方法は?
- 21. 待機操作がタイムアウトしました。ASP.NET
- 22. ASP.NET C#待機操作がタイムアウトしました
- 23. 複数のget操作の処理
- 24. Spring統合フローasyncでのエラー処理
- 25. ASP.NET開発サーバーの同時処理が機能しない
- 26. PostgreSQLでのタイムスタンプの操作 - 時間/時間帯の問題
- 27. ASP.NET MVC:ビューの処理量とヘルパーメソッドを使用する時間
- 28. ミューテックスロック待機時間とウォッチドッグ
- 29. ASP.NETで未処理のスレッド例外を処理する方法は?
- 30. CSVファイルの作成ASP.NETの同時処理の問題
ありがとうございますStephen Cleary! – Sunny
I/O操作でない場合はどうなりますか。関数内で実行され、非常に多くの時間を費やすビジネスロジックの場合新しいスレッドを作成しませんか? – Sunny
@サニー:いいえ、 'async'を' await'なしで使うと、コードは単に呼び出しスレッド上で直接実行されます。 'await Task.Run'を使うと、' Task.Run'(*非* async'/'await')は別のスレッドプールスレッドを使います(注:これはASP.NETではお勧めしません)。 –