2012-05-02 16 views
29

次のコードは動作しますが、作成したMemoryStreamが正しく閉じられているかどうかは疑問です。これはどうすればいいですか、それとも私のためにFileStreamResultを処理しますか?FileStreamResultでは、MemoryStreamはどのように閉じられていますか?

public FileStreamResult DownloadBudgetedRoleOpportunities(
    Guid projectGuid, 
    IEnumerable<Guid> guidRequiredRoles) 
{ 
    var rolebroker = new ProjectRoleBudgetBroker(); 
    var memstream = rolebroker.CreateBudgetedRoleOpportunies(
     projectGuid, 
     guidRequiredRoles); 

    var fsr = new FileStreamResult (memstream, "application/csv") 
       { 
       FileDownloadName = "RoleOpportunities.csv" 
       }; 
    // memstream.Close(); throws exception 
    return fsr; 
} 

答えて

37

FileStreamResultがこれを行います。コードが決して存在しないし、ASP.NET MVCはオープンソースなので、コードを見るのがさらに簡単です。

GoogleでFileStreamResult.csをすばやく検索すると、WriteFileメソッドでストリームが正しくusingステートメントを使用して削除されていることを確認できます。 (しゃれが意図していない)

protected override void WriteFile(HttpResponseBase response) { 
    // grab chunks of data and write to the output stream 
    Stream outputStream = response.OutputStream; 
    using (FileStream) { 
     byte[] buffer = new byte[_bufferSize]; 

     while (true) { 
      int bytesRead = FileStream.Read(buffer, 0, _bufferSize); 
      if (bytesRead == 0) { 
       // no more data 
       break; 
      } 

      outputStream.Write(buffer, 0, bytesRead); 
     } 
    } 
} 
2

あなたは、ソースコードへのアクセス権を持っているので、あなた自身を確認することができます;-)

protected override void WriteFile(HttpResponseBase response) 
{ 
    Stream outputStream = response.OutputStream; 
    using (this.FileStream) 
    { 
    byte[] buffer = new byte[4096]; 
    while (true) 
    { 
     int count = this.FileStream.Read(buffer, 0, 4096); 
     if (count != 0) 
     outputStream.Write(buffer, 0, count); 
     else 
     break; 
    } 
    } 
} 
関連する問題