非同期操作
アプリケーションがインターネット リソースにアクセスするのにかかる時間は、使用されている接続、リソースが配置されているサーバー、リソースにアクセスしようとしているユーザーの数など、さまざまな要因によって異なります。 複数のリソースをダウンロードしたり、複数のタスク (1 つ以上のダウンロードを含む) を処理したりするアプリケーションの場合、各ダウンロードが完了してから次のタスクに進むのを待つのは非常に非効率的な場合があります。 アプリケーションが待機する時間を短縮するために、WinINet 関数の多くは非同期的に動作できます。
非同期モードでは、アプリケーションは、パラメーターの 1 つとしてコンテキスト値を含む任意の関数を実行でき、アプリケーションがその関数のタスクの完了を待機している間、他のコマンドまたは関数を引き続き実行できます。 タスクの完了中、アプリケーションによって提供される状態コールバック関数には、タスクの進行状況と完了時刻が通知されます。 現時点では、状態コールバック関数は、他の関数を呼び出したり、タスクの完了に依存していた他の必要なタスクを実行したりできます。
WinINet を非同期的に呼び出すときにコールバック スレッドの完了はありません。呼び出しは 1 つのスレッドから開始される可能性がありますが、他のスレッドはコールバックを受け取ることができます。
メリット
非同期操作にはいくつかの利点があります。 次に例を示します。
複数のインターネット リソースを同時にダウンロードする。
複数のインターネット リソースに同時に接続し、使用可能になったときにダウンロードできます。
アプリケーションのパフォーマンスを向上させます。
WinINet 関数を非同期的に使用するアプリケーションは、要求が完了するまで待機する必要がないため、アプリケーションは要求に依存しない他のタスクを自由に実行できるため、アプリケーションの全体的なパフォーマンスが向上します。
ダウンロードの進行状況を監視します。
状態コールバック関数は、要求の処理中に通知を受け取ります。 必要に応じて、アプリケーションはその状態コールバック関数によって提供される情報を使用して、操作の進行状況についてユーザーに通知し続けたり、完了までに時間がかかりすぎる要求を中断したりできます。
シナリオ
アプリケーションで Downfall Coffee Tea と Fourth Coffee & サイトからコーヒーの価格をダウンロードし、価格を比較する必要があるとします。 Fourth Coffee サイトは通常、応答時間が遅いので、アプリケーションは最初に Downfall Coffee & Tea から情報をダウンロードする必要があります。
アプリケーションの 2 つのバージョンが開発されています。 同期的に動作し、最初にDownfall Coffee & Teaサイトから価格をダウンロードし、次に Fourth Coffee サイトから価格をダウンロードします。 2 つ目は非同期的に動作し、両方のサイトに要求を送信し、利用可能になったときに価格をダウンロードします。
次の表は、特定の日に Fourth Coffee サイトの方が高速だった場合に何が起こるかを示しています。
Event | 同期バージョン | 非同期バージョン |
---|---|---|
[開始] | Downfall Coffee & Tea に要求を送信する | Downfall Coffee Tea と Fourth Coffee & に要求を送信する |
非同期バージョンから Fourth Coffee への要求が完了しました | 待機中 | Fourth Coffee から価格をダウンロードする |
ダウンフォールコーヒー & ティーへのリクエスト完了 | ダウンフォールコーヒー & ティーから価格をダウンロード | ダウンフォールコーヒー & ティーから価格をダウンロード |
ダウンフォールコーヒー & ティーの価格がダウンロードされた後 | Fourth Coffee に要求を送信する | 価格を比較する |
非同期バージョンの比較が完了しました | 待機中 | 操作の完了 |
同期バージョンから Fourth Coffee への要求が完了しました | Fourth Coffee から価格をダウンロードする | 該当なし |
Fourth Coffee の価格がダウンロードされた後 | 価格を比較する | 該当なし |
同期バージョンの比較が完了しました | 操作の完了 | 該当なし |
もう 1 つの例は、Microsoft インターネット エクスプローラーなどの Web ブラウザーです。 ブラウザーでページをダウンロードする場合、画像やサウンド ファイルなど、他のリソースをダウンロードする必要があることがよくあります。 非同期モードでは、ページと各リソースを一度に 1 つずつ要求してダウンロードする代わりに、ページとそれに関連付けられているリソースを同時に要求し、使用可能になったときにダウンロードできます。
関連トピック
関連リンクを次に示します。
チュートリアル
非同期操作を設定するために必要な関数
非同期的に使用できる関数
- FtpCreateDirectory
- FtpDeleteFile
- FtpFindFirstFile
- FtpGetCurrentDirectory
- FtpGetFile
- FtpOpenFile
- FtpPutFile
- FtpRemoveDirectory
- FtpRenameFile
- FtpSetCurrentDirectory
- GopherFindFirstFile
- GopherOpenFile
- HttpEndRequest
- HttpOpenRequest
- HttpSendRequestEx
- InternetConnect
- InternetOpenUrl
- InternetReadFileEx
Note
FtpCreateDirectory、FtpRemoveDirectory、FtpSetCurrentDirectory、FtpGetCurrentDirectory、FtpDeleteFile、および FtpRenameFile 関数は、InternetConnect 関数の呼び出しで指定されたコンテキスト値を使用します。
Note
WinINet では、サーバーの実装はサポートされていません。 また、サービスから使用しないでください。 サーバーの実装またはサービスの場合は、 Microsoft Windows HTTP サービス (WinHTTP) を使用します。