2012-02-11 13 views
2

ExecuteRegisteredAsyncTasks呼び出しからの戻りコードが、この呼び出しの前にコードと同じスレッドで実行されていることに気付きました。だから私は手動でExecuteRegisteredAsyncTasksを呼び出すことは、他の要求を処理するために要求処理スレッドを解放せず、このメソッドはスケーリングの利点を得るために自動的に呼び出されるだけであることを理解していますか?ExecuteRegisteredAsyncTasksはリクエスト処理スレッドを解放して他のリクエストを処理しますか?

ここでは、msdnはサンプルコードですが、ヘルプはこの質問に答えません。私の場合は

UPDATE

PageAsyncTasksに私は非同期的に(* *と終了を開始使用して)Webサービスを呼び出していますので、私は、スレッドプールを使用していません。

答えて

4

RegisterAsyncTaskメソッドのMSDNの例では、BeginメソッドとEndメソッドで呼び出されるAsyncTaskDelegateを単に宣言します。デリゲートを非同期に呼び出すと、スレッドプールからのスレッドが使用されるため、基本的にこの場合は改善されません。唯一の速度向上は、複数の操作を並行して実行していた場合、それ以外の場合は同期的に実行される可能性があります。

実際のパフォーマンスを向上させたい場合は、IOCP(I/O Completion Ports)を使用する必要があります。これらは、ネットワークコール(データベースコール、Webサービスコールなど)などのI/O集中型タスクに適合しています。 CPU集約型タスクには適していません。では、WebClient.DownloadStringAsyncメソッドを使用してHTTPコールを実行するとします。このメソッドは、スレッドプールからスレッドを使用しません。 IOCPをカーネルに登録し、HTTP要求を起動します。呼び出し側に制御を戻すときには、スレッドは消費されず、これはHTTP要求期間全体にわたって行われます。要求が完了すると、IOCPが通知され、スレッドプールからスレッドが引き出されて結果が処理されます。

asynchronous pages in ASP.NETの記事をご覧ください。 IOCPはそこでよく説明されています。

+0

ありがとうございました。私の更新を参照してください。私はこの記事を読んだだけですが、この質問には答えません。 – Pol

+0

@Polなので、メソッドの非同期バージョンでWebサービスを呼び出す場合は、スレッドプールからスレッドを使用していません。あなたの質問に答えてください:はい、この場合、リクエスト処理スレッドはWebサービスコール中に解放されます。 –

+0

私のコードで 'ExecuteRegisteredAsyncTasks'を直接呼び出しても、それがページ処理のポイントで自動的に呼び出されても問題ありませんか?どちらの場合も、リクエスト処理スレッドはWebサービスコール中に解放されますか? – Pol

関連する問題