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のリファレンスソースを読んだところ、ポイントは
- Flush()
- Stream.Close()
- インスタンスメンバにnull代入
しっかりStreamを閉じていました。残念っ!