Согласно
документации, метод
Close у
StreamWriter самостоятельно закрывает нижележащий поток (в вашем случае это
FileStream). И при закрытии нижележащего потока
StreamWriter пытается записать в него всё, что, возможно, успело накопиться в буфере,но еще не было записано (строка
System.IO.StreamWriter.Flush(Boolean flushStream, Boolean flushEncoder)
в вашем стектрейсе).
Но так как файловый поток уже закрыт, вызов метода
Flush приводит к ошибке.
Совет на будущее - закрывайте потоки в порядке обратном тому, в котором вы их открывали. Т.е. если вы их открывали в порядке
A -> B(A) -> C(B), то закрывать их надо в порядке
C, B, A.
По крайней мере в Java, закрытие уже закрытого потока является по сути no-op (если поток уже закрыт, то делается
return из метода
Close). И подозреваю, что в C# сделано так же. А значит и ошибок таких не будет.