を呼び出す理由はいくつかありますCancelIo
が、私の特定のケースでは、システムがバッファに書き込んでいないことを知るために呼び出しています。それがわかれば、バッファを安全に解放できます。
しかし、CancelIo
失敗した場合はどうなりますか?私が今行っていることは、明示的にバッファをリークして例外をスローすることです。これに対処するより良い方法はありますか?
PS エウロパ、ガニメデ、カリストの類似の呼び出しが欠落しているようです。バグを報告する必要がありますか?
を呼び出す理由はいくつかありますCancelIo
が、私の特定のケースでは、システムがバッファに書き込んでいないことを知るために呼び出しています。それがわかれば、バッファを安全に解放できます。
しかし、CancelIo
失敗した場合はどうなりますか?私が今行っていることは、明示的にバッファをリークして例外をスローすることです。これに対処するより良い方法はありますか?
PS エウロパ、ガニメデ、カリストの類似の呼び出しが欠落しているようです。バグを報告する必要がありますか?
私の答えは、あなたの質問とは関係ないかもしれません。しかし、助けになるかもしれません..
async IO..CancelIoEx では、保留中の IO をキャンセルします。保留中の IO がある場合は、1 を返し、完了メッセージまたは呼び出し完了コードを生成します。保留中の IO がない場合は、エラーコード 1168 とともに 0 を返します。完了メッセージと呼び出し完了コードはありません。でも実は。cancelioex が呼び出された直後に、スケジュールされた IO が到着する可能性があります。これはすべて悪の根源です。すべてのIOをキャンセルしたと思いました。しかし、まだIOが残っています..
私がすでに見つけたものよりも満足のいく答えはここにはないと思います:
バッファをリークします (そして例外をスローします (または環境で同等のことを行います))。
キャンセル リクエストを発行した後、すぐにバッファーを削除しないでください。
CancelIoExのドキュメントから取得:
指定されたファイル ハンドルに対して進行中の保留中の I/O 操作がある場合、CancelIoEx 関数はそれらにキャンセルのマークを付けます。ほとんどの種類の操作はすぐにキャンセルできます。他の操作は、実際にキャンセルされて呼び出し元に通知される前に、完了に向かって続行できます。CancelIoEx 関数は、キャンセルされたすべての操作が完了するまで待機しません。
そのCancelIo
ため、io 操作は「解放」されず、「キャンセル済み」としてのみマークされます。async-Read/Write の結果が完了するまで待つ必要があります (正常に終了するか、ERROR_OPERATION_ABORTED
.
MSDN のドキュメントでは、どのようなエラーが返されるかについて明確ではありません。私は(CancelIo
とにかく非同期なので)これはあなたが悪いハンドルを使用したか、そのような主要なものを使用したことを意味すると思います。非同期とは、CancelIo
OK が返されたからといって、保留中の I/O のバッファーをすぐに解放できないことを意味します。
保留中の I/O が で返されることがドキュメントに記載されていますERROR_OPERATION_ABORTED
。保留中のすべての I/O がこのエラーを返す場合にのみ、バッファーを安全に解放できるように、保留中の I/O 状態を既に追跡していると思います。保留中の I/O が の後CancelIo
にハングしたままになっている場合、バッファを解放すると、望ましくない副作用が次々と発生する可能性があります。