PCLでHttpStream を作ってみた
-
Upload
takashi-kawasaki -
Category
Technology
-
view
157 -
download
7
Transcript of PCLでHttpStream を作ってみた
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 でお茶を濁す?• メモリ使用量が心配
• 再起動したらキャッシュが消える
• PCL Storage• https://pclstorage.codeplex.com/
• IFolder/IFile微妙にダサい/大げさすぎる
•自分で頑張る• DIとかでプラットフォーム毎のコードを抱え込む
HttpStream
• Stream.Read発生時にデータを取得し始める
•長さの分からないリソースは、便宜的に 0xffffffffffffffff というサイズだとする
•内部的には適当なブロック単位での読み込み(64KB)
•非同期対応 (ReadAsync)
• Rangeアクセス出来ない場合には諦めて全部読み込む
HttpStream : CacheStream
•汎用のストリームキャッシュの仕組み
• HttpStreamは CacheStreamを継承する
•二つのメソッドを実装する:abstract long GetStreamLengthOrDefault(long defValue);
abstract Task<Range> LoadAsync(
Stream stream,
Range rangeToLoad,
CancellationToken cancellationToken);
ランダムシーク
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);
ダウンロードした区間をRange型で記憶
public class Range : IComparable<Range>
{
public long Offset;
public long Length;
public int CompareTo(Range other)
{
return (int)(Offset - other.Offset);
}
}
Offset
Length
ダウンロードした区間をRange型で記憶
List<Range> _ranges;
_ranges.BinarySearch(new Range(Position, Count));
PCL ターゲット分からない