2010-10-16 18 views
1

Il y a un certain nombre de raisons pour appeler CancelIo, mais dans mon cas particulier, je l'appelle afin de savoir que le système n'écrit plus dans un tampon. Une fois que je le sais, je peux libérer le tampon en toute sécurité.Que faire si CancelIo échoue?

Mais que se passe-t-il si CancelIo échoue? Ce que je fais maintenant est explicitement fuir le tampon et lancer une exception. Y a-t-il de meilleures façons de gérer cela?

P.S. Des appels analogues pour Europa, Ganymede et Callisto semblent manquer. Dois-je déposer un bug?

Répondre

0

Je ne pense pas qu'il y ait une réponse ici plus satisfaisante que celle que je trouvais déjà.

fuite le tampon (et jeter une exception (ou faire l'équivalent pour votre environnement)).

0

Les documents MSDN ne sont pas très claires sur les erreurs pouvant être renvoyées. J'imagine (depuis CancelIo est asynchrone de toute façon) que cela signifie que vous avez utilisé un mauvais handle, ou quelque chose de majeur comme ça. Par asynchrone, je veux dire que juste parce que CancelIo renvoie OK, vous ne pouvez pas libérer immédiatement le tampon pour toute E/S en attente.

est indiqué dans les documents que les E/S en attente seront retournées avec ERROR_OPERATION_ABORTED. Je pense que vous suivez déjà l'état d'E/S en attente de sorte que vous pouvez libérer le tampon en toute sécurité si et seulement si toutes les E/S en attente retournent cette erreur. Si une E/S en attente reste suspendue après CancelIo, la libération du tampon peut provoquer une cascade d'effets secondaires indésirables.

+0

Exactement. C'est pourquoi je (actuellement) fuir le tampon. –

+0

Si vous ne pouvez pas comptabiliser les E/S en attente, je ne vois aucun choix. –

0

Vous ne devez pas supprimer immédiatement vos tampons après avoir émis une demande d'annulation.

provenir de la documentation CancelIoEx:

S'il y a des opérations d'E/S en attente en cours pour la poignée de fichier spécifié, la fonction CancelIoEx les marque d'annulation. La plupart des types d'opérations peuvent être annulés immédiatement. Les autres opérations peuvent continuer jusqu'à la fin avant d'être annulées et l'appelant est averti. La fonction CancelIoEx n'attend pas que toutes les opérations annulées se terminent.

Donc, CancelIo ne «libère» pas l'opération io, mais la marque seulement comme «annulée». Vous devez attendre le résultat de votre async-lecture/écriture à la fin (soit avec succès ou avec ERROR_OPERATION_ABORTED

+0

Pas de soucis. J'attends l'événement concerné avant de libérer le tampon. –

+0

Notez que cette restriction s'applique à 'CancelIoEx', avec lequel vous devez toujours appeler' GetOverlappedResult'.'CancelIO', semble annuler de manière synchrone (probablement parce qu'il est appelé sur le thread émetteur de toute façon) – peterchen

0

Ma réponse peut-être pas lié à votre question. mais pourrait être une aide ..

Dans IO..CancelIoEx async annuler En attente d'E/S S'il y a des E/S en attente, il renvoie 1 et génère un message d'achèvement ou un appel com code de pletion. S'il n'y a pas d'E/S en attente, il renvoie 0 avec le code d'erreur 1168..aucun message d'achèvement et aucun code d'achèvement d'appel. Mais en réalité. il pourrait arriver IO schedulled juste après cancelioex appelé. Tout est racine du mal. Je pensais annulé tous les IO. mais il reste encore IO.