私は、バイトと構造化された値の型を非同期で読み書きしたいのですが、デコーダとバイトシフトについて心配する必要はありません。.Netの非同期BinaryReaderとBinaryWriter?
答えて
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))
{
//...
}
このことに注意してください完全なバッファが簡単にメモリに収まり、パフォーマンスが低下する可能性がある場合にのみ便利です。
- 1. C++ BinaryReaderとBinaryWriter
- 2. C++のBinaryWriterとBinaryReader
- 3. BinaryReaderとBinaryWriter for dynamic short array
- 4. 非同期.NETの例外
- 5. .net-4.6の非同期Thread.CurrentThread.CurrentCulture
- 6. .NETコアの非同期リクエスト
- 7. .net rest API対Node.jsと非同期非ブロッキングアプリケーション用の他のプラットフォーム
- 8. .NET非同期Oracle接続のアプローチ
- 9. 非同期サポートのクロスプラットフォーム.NET WebSocketサーバーライブラリ
- 10. .NET MVC3の完全非同期Webアプリケーション
- 11. .NEt Javaの非同期CTP相当
- 12. .NET HTTPClient非同期の制限
- 13. .NET非同期コアのRebusクラッシュ
- 14. 非同期操作と非同期ネットワークタスク?
- 15. 非同期ソケットと同期
- 16. MSMQ非同期例外動作 - .NET 4.0と.NET 2.0
- 17. WebAPI2とEntity Framework 6と.Net 4.6での非同期の使用
- 18. HTTPハンドラ非同期問題.NET 4.5.2
- 19. SignalR .Netクライアント非同期再接続
- 20. .NETコアによる非同期プログラミング?
- 21. .net非同期異常動作
- 22. RxSwiftとの非同期ネットワークコールの同期
- 23. RxJSとの非同期アクションの同期
- 24. 非同期mvc .net:非同期メソッドからビューを返す方法
- 25. 同期と非同期のアクティビティ
- 26. COMスレッドと.NETの同期
- 27. 非同期ループ内の非同期メソッド
- 28. 非同期メソッドの非同期メソッド
- 29. Windows Named Pipes(.Net)との非同期双方向通信
- 30. 非同期プロミスと()
「Stream.BeginRead」などはどうですか? –
ストリーム上にあり、BinaryReaderとBinaryWriterではありません。 – Henrik
バイトを読み書きしたい。そのためには 'BinaryReader' /' BinaryWriter'は必要ありません。彼らは実際にその目的に向かって積極的に役に立たないでしょう。 –