次のシナリオを検討してください。
auto h = CreateFile(...);
ReadFileEx(h, ...); // Asynchronous read for a large block of data. say, 1GB.
CloseHandle(h);
// If the read has not yet finished here, what will happen? Big Bang???
次のシナリオを検討してください。
auto h = CreateFile(...);
ReadFileEx(h, ...); // Asynchronous read for a large block of data. say, 1GB.
CloseHandle(h);
// If the read has not yet finished here, what will happen? Big Bang???
非同期ハンドルが呼び出し時に有効である限り、非同期操作は完了するまで有効なままです。これは、非同期ファイルIO呼び出しが、カーネル内のファイルオブジェクトへの暗黙の参照カウントを保持しているためです。
非同期イベントが完了すると、ファイルを指すユーザーモードのハンドルがなくなると、ファイルはカーネルの内部で閉じられます。
これには目に見える副作用があることに注意してください。特に、ファイルを排他的な読み取り/書き込み用に開いて、非同期操作を発行してからハンドルを閉じると、非同期操作が完了するまでファイルを読み取り/書き込み用に開くことができなくなります。