tmytのらくがき

個人の日記レベルです

StreamReaderよくわからん

いろいろあって、AsyncOAuthをWinRT版のHttpClientを使うように改造して使ってるわけなんですが、TwitterのStreamAPIを叩いたときにいまいち挙動が変。

使っているコードはこれ。

var client = Create(); // new AsyncOAuth です。

using (var stream = await client.GetInputStreamAsync(new Uri(User)))
using (var sr = new StreamReader())
{
    OnConnectionStateChanged(ConnectionState.Connected);
    while (!sr.EndOfStream && !ct.IsCancellationRequested)
    {
        var s = await sr.ReadLineAsync(ct); // キャンセルできるReadLineAsyncです
        if (s == null) continue;
        Debug.WriteLine(s); // *1
        observer.OnNext(s);
    }
}

ここで、*1が呼ばれるタイミングがStreamAPIの2行目を受信したタイミングで、1行目が読めてくる。なんでかはよくわからない。

そこで。StreamReaderを生成するときのコンストラクタを少し変更。

new StreamReader(stream.AsStreamForRead(), Encoding.UTF8, false, 8192)

こうすると、1行目が終わったタイミングですぐさまイベントが帰ってくるように。たぶんバッファの長さの都合で、改行にヒットしないとかそういう感じなのが原因だったんでしょう…でもよくわからん。