SlideShare a Scribd company logo
1 of 13
Download to read offline
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 ターゲット分からない 

More Related Content

Recently uploaded

IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directoryosamut
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールsugiuralab
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価sugiuralab
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 

Recently uploaded (7)

IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツール
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
 

PCLで HttpStream を作ってみた