2012-04-25 12 views
6

私は、バイトと構造化された値の型を非同期で読み書きしたいのですが、デコーダとバイトシフトについて心配する必要はありません。.Netの非同期BinaryReaderとBinaryWriter?

+0

「Stream.BeginRead」などはどうですか? –

+0

ストリーム上にあり、BinaryReaderとBinaryWriterではありません。 – Henrik

+0

バイトを読み書きしたい。そのためには 'BinaryReader' /' BinaryWriter'は必要ありません。彼らは実際にその目的に向かって積極的に役に立たないでしょう。 –

答えて

7

BinaryReaderまたはBinaryWriterでは不可能です。あなたは、基礎となるBaseStreamから同時に読むことができるが、documentation状態は次のとおりです。

読みながらやBinaryReaderを使用しながら、基になるストリームを使用すると、データの損失や破損を引き起こす可能性があります。たとえば、同じバイトが複数回読み取られたり、バイトがスキップされたり、文字の読み取りが予測できなくなる可能性があります。

したがって、独自の実装をロールバックする方法があります。しかし、それをする利点は議論の余地があります。 XxxAsyncメソッドを持っていないBinaryReader /ライターは、これらのタイプの方法は、一般的に/からごく少数のバイトを読み書きすることをであることを理由:

ジョン:マイクロソフトからマルコ・グレッグは、ブログの記事Should I expose asynchronous wrappers for synchronous methods?に以下のコメントを追加しました以前に開かれていた基底ストリーム。実際には、データは頻繁にキャッシュされ、基礎となるソースからデータをフェッチするために必要な時間は通常は非常に短く、非同期に行う価値はありません。

特に、これらのタイプには、場合によっては大量のデータ(例:ReadString)を転送するメソッドがあります。さらにラインを下げると、これらのメソッドの非同期バージョンが追加される場合と追加されない場合がありますが、近い将来に発生する可能性は低いです。

一般に、読み込んでいるデータの量が多い場合(少なくとも数百または数千バイト)、または初めてリソースにアクセスする場合(たとえば最初のファイルからの読み取りは、1バイトを読み込んでいてもディスクをスピンアップする必要があります)。

これは合理的です。ソリューションが必要な場合は、BinaryReader/BinaryWriterを転記する以外にいくつかの回避策があります。あなたは(非効率的なことができます)別のスレッドで実行することができたり、ファイル形式やワイヤプロトコルを変更するために喜んでいる場合は、このパターン(擬似コード)を使用することができます

//read packet length 
await stream.ReadAsync(buffer); 
var packetLength=convertToInt(buffer); 

//read complete packet asynchronously 
await stream.ReadAsync(buffer,packetLength); 

//process packet with BinaryReader 
using(var br=new BinaryReader(new MemoryStream(buffer)) 
{ 
    //... 
} 

このことに注意してください完全なバッファが簡単にメモリに収まり、パフォーマンスが低下する可能性がある場合にのみ便利です。

関連する問題