私はMailKit/MimeKitで遊んでいて、何かが私を悩ませています。ストリームを使って添付ファイル付きの電子メールを送ろうと思っていました。 MimeKitは、身体のメッセージを作成し、ファイルを添付することが非常に容易になりますBodyBuilder
クラスを提供しています:添付ファイル付きの電子メールを送信するときにMimeKitで使用されるストリームを破棄する必要がありますか?
public void SendEmail(string body, Stream attachment, string fileName)
{
var message = new MimeMessage();
message.From.Add(new MailboxAddress("Carl", "[email protected]"));
message.To.Add(new MailboxAddress("Rick", "[email protected]"));
message.Subject = "Things got messy...?";
var builder = new BodyBuilder();
builder.TextBody = body;
builder.Attachments.Add(fileName, attachment);
message.Body = builder.ToMessageBody();
using (var client = new SmtpClient())
{
// code to send e-mail here...
}
}
私は他の場所で私のコードでストリームを生成し、私はそれを閉じていないので、私はMimeKitへのそれを渡すことができます。明確ではないことは、MimeKitはストリームを破棄しますか?基本的には(私が知っている限り)消費者は通常Streamsを廃棄する責任があります。また、私は基本的に使用しているMemoryStreamでdisposeを呼び出すと、リソースを解放することはできませんが、読み書きはできません。しかし、将来、実装が別のタイプのストリームに変更されると、事態がより複雑になる可能性があります。
私もMikeKitのソースコードに掘る、とAttachmentCollection.Add
に渡されたストリームは、ストリームから継承(および廃棄を実装)MemoryBlockStream
に「追加」されますので、私はこの時、それはの配置されたを取得想定したがいことがわかりましたポイント、私はちょうど推測しています。
アイデア?
これがなぜ「なぜ」になるのでしょうか? 'MimeKit'はあなたのためにこれをしていますか?この質問は、私たち(よく、ヒープと私たちのdevsのヒープ)が ''身代金 'を継承するので、そのクラスの処理を断念する' 'HttpClient'シナリオに戻って考えますが、2016年にはそれをシングルトンではなくdispose(なぜコードサンプルで説明されたのか)。だから - ちょうど学びたい: –
それはまさに私のポイントだった。私は答えを知っていたので、まず質問が必要ないと主張することができました。しかし、私はそれがどのように機能するのか知りたかったので、私は盲目的にやっていません。 – jpgrassi
MemoryBlockStreamのDisposeメソッドは、バイト配列を破棄することができないため、操作しません。 Disposeメソッドは、クラスがアンマネージリソースを使用する場合にのみ必要です。 – jstedfast