Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
PCLで
HttpStream を作ってみた
川崎 高志 @espresso3389
誰?
川崎 高志
クミナス株式会社 Cuminas Corporation
代表取締役社長
主に使っている言語:
C/C++ 70%
C# 20%
その他 10%
HTTPStream
• HTTP 1.1 の Range Access
• うまく行けばランダムシークできる
• 最悪でも普通のダウンロードと同じ
• PDF を読み込むときには、お尻から読み込む
• 効率的なロードにはランダムアクセスが欠か...
PCL Stream Class
• HttpClient がないよん
• Stream.Close がないよん (IDisposable.Dispose 使う)
• FileStream とかないよん
HttpClient がないよん
• Microsoft.Net.Http
• Microsoft HTTP Client Libraries
https://www.nuget.org/packages/Microsoft.Net.Http
Close がないよん
• IDisposable.Dispose 使う
• そもそも Stream.Close なんていらんかったんやー
• Dispose(bool disposing) を実装すればOK
FileStream とかないよん
• 諦める?
• 引数としてプラットフォーム依存コードから Stream の形で貰う
• キャッシュとかは MemoryStream でお茶を濁す?
• メモリ使用量が心配
• 再起動したらキャッシュが消える...
HttpStream
• Stream.Read 発生時にデータを取得し始める
• 長さの分からないリソースは、便宜的に 0xffffffffffffffff と
いうサイズだとする
• 内部的には適当なブロック単位での読み込み(64KB)
•...
HttpStream : CacheStream
• 汎用のストリームキャッシュの仕組み
• HttpStream は CacheStream を継承する
• 二つのメソッドを実装する:
abstract long GetStreamLengt...
ランダムシーク
public override async Task<int> ReadAsync(
byte[] buffer, int offset, int count,
CancellationToken cancellationTok...
ダウンロードした区間をRange型で記憶
public class Range : IComparable<Range>
{
public long Offset;
public long Length;
public int CompareT...
ダウンロードした区間をRange型で記憶
List<Range> _ranges;
_ranges.BinarySearch(new Range(Position, Count));
PCL ターゲット分からない 
Upcoming SlideShare
Loading in …5
×

PCLで HttpStream を作ってみた

557 views

Published on

PCLで HttpStream を作ってみたという話
https://github.com/espresso3389/HttpStream

Published in: Technology

PCLで HttpStream を作ってみた

  1. 1. PCLで HttpStream を作ってみた 川崎 高志 @espresso3389
  2. 2. 誰? 川崎 高志 クミナス株式会社 Cuminas Corporation 代表取締役社長 主に使っている言語: C/C++ 70% C# 20% その他 10%
  3. 3. HTTPStream • HTTP 1.1 の Range Access • うまく行けばランダムシークできる • 最悪でも普通のダウンロードと同じ • PDF を読み込むときには、お尻から読み込む • 効率的なロードにはランダムアクセスが欠かせない!
  4. 4. PCL Stream Class • HttpClient がないよん • Stream.Close がないよん (IDisposable.Dispose 使う) • FileStream とかないよん
  5. 5. HttpClient がないよん • Microsoft.Net.Http • Microsoft HTTP Client Libraries https://www.nuget.org/packages/Microsoft.Net.Http
  6. 6. Close がないよん • IDisposable.Dispose 使う • そもそも Stream.Close なんていらんかったんやー • Dispose(bool disposing) を実装すればOK
  7. 7. FileStream とかないよん • 諦める? • 引数としてプラットフォーム依存コードから Stream の形で貰う • キャッシュとかは MemoryStream でお茶を濁す? • メモリ使用量が心配 • 再起動したらキャッシュが消える • PCL Storage • https://pclstorage.codeplex.com/ • IFolder/IFile 微妙にダサい/大げさすぎる • 自分で頑張る • DIとかでプラットフォーム毎のコードを抱え込む
  8. 8. HttpStream • Stream.Read 発生時にデータを取得し始める • 長さの分からないリソースは、便宜的に 0xffffffffffffffff と いうサイズだとする • 内部的には適当なブロック単位での読み込み(64KB) • 非同期対応 (ReadAsync) • Rangeアクセス出来ない場合には諦めて全部読み込む
  9. 9. HttpStream : CacheStream • 汎用のストリームキャッシュの仕組み • HttpStream は CacheStream を継承する • 二つのメソッドを実装する: abstract long GetStreamLengthOrDefault(long defValue); abstract Task<Range> LoadAsync( Stream stream, Range rangeToLoad, CancellationToken cancellationToken);
  10. 10. ランダムシーク public override async Task<int> ReadAsync( byte[] buffer, int offset, int count, CancellationToken cancellationToken); protected abstract Task<Range> LoadAsync( Stream stream, Range rangeToLoad, CancellationToken cancellationToken);
  11. 11. ダウンロードした区間をRange型で記憶 public class Range : IComparable<Range> { public long Offset; public long Length; public int CompareTo(Range other) { return (int)(Offset - other.Offset); } } Offset Length
  12. 12. ダウンロードした区間をRange型で記憶 List<Range> _ranges; _ranges.BinarySearch(new Range(Position, Count));
  13. 13. PCL ターゲット分からない 

×