2011-09-09 13 views
1

私はASP.NETアプリケーションでメールに添付するファイルがあります。問題は、プロセスがファイルを放棄しないことです。メソッドでファイルを閉じて、プログラムで再び使用できるようにするにはどうすればよいですか?電子メールに添付ファイルを閉じるSystem.Net.Mail

Attachment data = new Attachment(@"\\WIN-UWPWZ7Z3RKX\wwwroot\katipro\skus.txt"); 
m.Attachments.Add(data); 

SmtpClient s = new SmtpClient("smtp.gmail.com", 587); 
s.Send(m); 

私がこのメソッドを呼び出すと、エラーなしで再びそのファイルに書き込むことはできません。

答えて

7

System.Net.Mail.AttachmentIDisposableを実装しています。あなたはあなたの添付ファイルを処分する必要があります。

using(Attachment data = new Attachment(@"\\WIN-UWPWZ7Z3RKX\wwwroot\katipro\skus.txt")) 
{ 
    m.Attachments.Add(data); 

    SmtpClient s = new SmtpClient("smtp.gmail.com", 587); 
    s.Send(m); 
} 

同様に、.NET Framework 4.0を使用している場合、 SmtpClientも使い捨てです。したがって、4.0 Frameworkを使用している場合は、それを廃棄してください。 常にを使用してIDisposableインターフェイスを実装するものを処分する必要があります。

1

Attachmentは、IDisposableを実装します。メッセージを送信した後でインスタンスを破棄してリソースを解放する必要があります。

... 
s.Send(m) 

data.Dispose(); 
2

あなたは、このようなファイルハンドルとしてアンマネージリソースを解放するために彼らのために使用するすべてのIDisposableオブジェクトを配置する必要があります。

using(MailMessage m = ...) 
{ 
    ... 
    using (Attachment data = ...) 
    { 
     ... 
     using (SmtpClient s = ...) 
     { 
      ... 
     } 
    } 
} 
1

MailMessageを処分するときに添付ファイルを処分する必要はありません。内部実装を見ると、MailMessageはすでに添付ファイル自体を破棄しています。

// MailMessage.cs 
protected virtual void Dispose(bool disposing) 
    { 
     if (disposing && !disposed) 
     { 
      disposed = true; 

      if(views != null){ 
       views.Dispose(); 
      } 
      if(attachments != null){ 
       attachments.Dispose(); 
      } 
      if(bodyView != null){ 
       bodyView.Dispose(); 
      } 
     } 
    } 

コードhttps://referencesource.microsoft.com/#System

から
関連する問題