StreamWriter.DisposeさんStream閉じないでください。

Case 1

TCPを使ったとあるメッセージングプロトコル向けにSocketをラップしたいのです。
Streamを使い回してWriterを公開メソッド内で生成することを思いつきました。

private NetworkStram stream;

void Send(string str)
{
    using (var writer = new StreamWriter(stream))
    {
        writer.WriteLine(str);
    }
}

ところが一度しか呼べないんだなーこれが。

Case 2

簡単なHTTPサーバーを作ろうと思います。
接続受け付けたらこんな感じ。

var stream = new NetworkStream(socket);
using (var reader = new StreamReader(stream))
{
    //要求の処理
}
using (var writer = new StreamWriter(stream))
{
    //レスポンスを返す
}

ところが要求の処理しか上手くいかないんだなーこれが。

Problem

usingブロックを抜けるとDisposeが呼ばれます。
StreamWriter/Reader.Dispose()は何をしているのでしょう。
CLRのリファレンスソースを読んだところ、ポイントは

しっかりStreamを閉じていました。残念っ!

Solution?

  • Reader/Writerに使うNetworkStreamを毎回生成する
    • 毎回StreamもWriter/Readerも生成するのはコストかかりそう
    • それに読みかけたデータは次のStream/Readerに持ち越せないよね?
    • BOM付きエンコーディングだとその度にBOM書き出すことに
  • Case2みたいに連続してるならブロックまとめて自分でFlush
    • めんどい。

  
という事を考えているうちに面倒になって直接Socket使いたくなるというお話。
余談ですがinternalなコンストラクタにストリーム閉じないオプションもあるようで、それ公開してくれればいいのにーなんて思いました。