Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Les applications ont plusieurs options pour recevoir des indications d’achèvement et fournir une certaine flexibilité aux développeurs. Les options doivent être bloquées en attendant qu’un appel d’API se termine ou utilise des routines d’achèvement pour les opérations asynchrones. L’avantage de l’utilisation d’opérations asynchrones est une augmentation de la réactivité de l’application.
E/S bloquées
Les applications peuvent bloquer en attendant que l’appel d’API se termine en définissant la structure deSE CHEVAUCHER sur NULL. Cela bloque vraiment toutes les opérations sur le thread. Par exemple, dans les appels à HttpWaitForDisconnect, les appels se bloquent jusqu’à ce que la connexion soit interrompue.
E/S asynchrones
Les applications qui préfèrent ne pas bloquer peuvent utiliser la structure SE CHEVAUCHER pour obtenir les résultats d’achèvement. L’application fournit un pointeur vers une structure de QUI SE CHEVAUCHE, qui est utilisée avec un objet événement ou un port d’achèvement. Avec un port d’achèvement d’E/S, un handle HTTP est utilisé comme handle de fichier dans une opération d’E/S de fichier asynchrone. Le tableau suivant récapitule les options d’achèvement disponibles pour les applications.
| Structure superposée | Objet Event | Port d’achèvement | Achèvement |
|---|---|---|---|
| NULL | Sans objet | Ignoré | L’opération se termine de façon synchrone. |
| NULL non | NULL non | NULL | L’opération se termine de manière asynchrone. Une notification superposée est effectuée en signalant un objet d’événement. |
| NULL non | Ignoré | NULL non | L’opération se termine de manière asynchrone. Une notification superposée est effectuée en planifiant une routine d’achèvement. |
Renvoi du nombre d’octets en lecture
Certaines des fonctions qui utilisent la structure deSE CHEVAUCHER pour la saisie semi-automatique asynchrone retournent un paramètre pBytesReceived (ou pBytesSent ou pBytesRead) qui indique le nombre d’octets transférés de manière synchrone. Pour les appels asynchrones, ce paramètre doit être défini sur NULL. Pour les appels synchrones, le paramètre pBytesReceived est facultatif et peut être NULL ou nonNULL.
Si l’objet d’événement est utilisé pour l’achèvement asynchrone, la fonction GetOverlappedResult est appelée pour déterminer le nombre d’octets lus. Si le port d’achèvement est utilisé (le paramètre hFile est associé à un port d’achèvement d’E/S), l’application appelle la fonction GetQueuedCompletionStatus pour déterminer le nombre d’octets lus. Si les opérations asynchrones n’ont pas été effectuées, les applications peuvent appeler la fonction GetLastError pour obtenir des informations d’erreur étendues.
Le tableau suivant résume le comportement d’achèvement pour l’achèvement synchrone et asynchrone dans les fonctions telles que HttpReceiveHttpRequest qui utilisent le paramètre pBytesReceived.
| pBytesReceived* | pOverlapped | Description |
|---|---|---|
| NULL | NULL | L’application ne reçoit pas d’informations sur le nombre d’octets retournés. |
| NULL | NULL non | L’opération asynchrone, pBytesReceived est sans signification. |
| NULL non | NULL | Opération synchrone, nombre d’octets retournés dans pBytesReceived. |
| NULL non | NULL non | L’opération asynchrone, pBytesReceived est ignorée même si elle n’est pas NULL.** |
Note
*Ce paramètre peut également être pBytesSent ou pBytesRead.
Note
**Il est recommandé que les applications passent une NULL dans pBytesReceived pour les opérations asynchrones et obtiennent le nombre d’octets reçus de GetOverlappedResult ou GetQueuedCompletionStatus.
Codes de retour
L’API serveur HTTP retourne trois classes de codes pour les appels de fonction asynchrones.
Lorsque ERROR_IO_PENDING ou NO_ERROR sont retournés à partir de l’appel de fonction asynchrone, les utilisateurs doivent s’attendre à ce que la routine d’événement ou d’achèvement soit signalée. L’appel de la fonction GetOverlappedResult pour l’événement ou la fonction GetQueuedCompletionStatus pour le port d’achèvement retourne l’état d’achèvement. En outre, si NO_ERROR est retournée, les applications peuvent effectuer un post-traitement sur le même thread que celui qui a effectué l’appel d’API.
Si l’API serveur HTTP retourne autre chose que ERROR_IO_PENDING ou NO_ERROR, à partir de l’appel de fonction asynchrone, la routine d’achèvement n’est pas signalée et l’erreur est directement retournée par l’API.