まず、EndRead のドキュメントでは、BeginReadによって開始された非同期読み取り操作がアトミックまたは中断不可能であると明示的に述べていません。
質問
FileStream.BeginRead によって開始された非同期読み取り操作を中断して、バッファがいっぱいになる前に終了し、これまでにバッファに読み取られたバイト数を返すことは可能ですか?
つまり、「Cancel_IO」のような呼び出し可能なメソッドがあり、EndRead を呼び出すと、可能なすべてのバイトが読み取られるのを待つのではなく、読み取りがキャンセルされた結果として早く返されますか?
バックグラウンド
FileStream、BeginRead、および EndRead のドキュメントを読みました。EndRead には、部分的にいっぱいのバッファーを返し、操作の早期完了をトリガーできるオーバーロードはありません。FileStream.BeginRead によって開始された操作が EndRead のときに早期に終了する可能性がある、Windows オペレーティング システムの API (Win32) またはディスク ドライバー API のメソッドの存在を誰かが確認または拒否できるかどうかに興味があります。呼ばれた。「早期」とは、要求されたバッファー長全体をエラーなしで満たす前を意味します。
使用事例
想像を絶するために、ファイルがネットワーク共有上にあり、ネットワークが極端な速度低下を経験する場合があると仮定すると、一般的な 1MB バッファリング操作の早期完了をトリガーすることが実用的かつ最適です。新しい 1MB バッファリング操作を再開する前に処理するための数バイト。
これらの「数バイト」を使用して、計算集約型の多数のメモリ内リソースの構築を開始できます。これらのリソースは、バッファリングの終了が許可されている間に構築できます。
ドキュメントについて
BeginRead のドキュメントでは、非同期操作がアトミックである、または中断できないことを明示的に述べていないことに注意してください。言及されているのは、「エラー」が発生した場合、EndRead が呼び出されるまでそれについてわからないということだけです。これは、EndRead が要求された数よりも少ないバイト数を返す原因となる、エラーではない他のイベントが発生する可能性を排除するものではありません。
たとえば、「ファイルの終わり」と「バッファがいっぱい」は、非同期読み取り操作の 2 つの「自然な」中断と見なすことができ、エラーなしで、要求されたバイト数よりも少ない数を返します。「人為的な」割り込みの可能性を探しています。これにより、EOF の前でバッファーがいっぱいになる前に、EndRead がバッファーに読み込まれたバイト数を正常に返すことにもなります。