0

一連のオブジェクトを破棄する良い方法を探しているので、基になるストリームの using ステートメントを使用して添付ファイルを作成する場合、問題は GetMessage にあります...メールメッセージを送信するときの方法 1 で添付ファイルのストリームは破棄され、エラーが発生します。using ステートメントを外すと find は機能しますが、DataStream Dest を適切に破棄していません。私の最初の方法は、GetMessage が呼び出されるたびに Dest を追加できるパラメータ List をメソッド 1 に追加し、メソッド 1 でメソッド ループの最後にリストを介してストリームを破棄することでした。SendMessage はバッチ プロセスからループで呼び出すことができるため、多くのストリームが作成される可能性があります。SendMessage は送信が行われる場所であり、必要があるため、GetMessage ではなく呼び出し元 (SendMessage) に任せて破棄したいと考えています。破棄する前に、メッセージが送信されたことを確認してください。助言がありますか???

                void sendMessage(MessageType type){
                   MailMessage m = Method2();
                   switch(type)
                   {
                      case type1:
                        m = Object1().GetMessage(param1)
                      case type2:
                        m = Object2().GetMessage(param1, param2)
                      case type3:
                        m = Object3().GetMessage(param1)
                      case type4:
                        m = Object4().GetMessage(param1, param2, param3)
                      case NewType5:
                        m = NewType5().GetMessage(param1, param2)
                   }
                   // this method does the send cause it has the mailmessage
                   m.Send();
                }

                class NewType5()
                {
                MailMessage GetMessage(){

                    // used to be 
                    // using (var Dest = new DataStream(true)){ .... }
                    DataStream Dest = new DataStream(true);

                    // code that reads info into the stream

                    // Go back to the start of the stream
                    Dest.Position = 0;

                    // Create attachment from the stream
                    Attachment mailattachement = new Attachment(Dest, contentType);

                    //Create our return value
                    var message = new MailMessage();
                    message.To.Add(UserInfo.UserDetail.Email);
                    message.Subject = "P&L Data View - " + DateTime.Now.ToString();
                    message.Attachments.Add(mailattachement);
                    return message;
               }
             }

send を GetMessage に移動するには、他のすべてのオブジェクトの他のすべてのオブジェクトの実装を変更する必要があります。バッチプロセスから500回呼び出される可能性があるため、newtype5の破棄はsend messageに任せたいと思います。これにより、例がもう少し明確になりますか。Send Message は、GetMessage 実装を持つ他のいくつかのオブジェクトに対して実装され、既に書き込まれています。私はたまたまストリームを使用しているだけで、送信が行われる前にストリームを破棄できません。

4

2 に答える 2

1

それを移動して meth2: のパラメーターにしないのはなぜですか?

            void method1(){
               using (var Dest = new DataStream(true))
               {
                   MailMessage m = Method2(Dest);
                   .....
                   m.Send();
               }
            }

            MailMessage Method2(Stream Dest){

                // code that reads info into the stream

                // Go back to the start of the stream
                Dest.Position = 0;

                // Create attachment from the stream
                Attachment mailattachement = new Attachment(Dest, contentType);

                //Create our return value
                var message = new MailMessage();
                message.To.Add(UserInfo.UserDetail.Email);
                message.Subject = "P&L Data View - " + DateTime.Now.ToString();
                message.Attachments.Add(mailattachement);
                return message;
           }

Message.Send() メソッドは非同期ですか? 送信を並列化しますか?

于 2012-08-09T14:08:24.233 に答える
1

Method2 で MailMessage.Send を実行することをお勧めします。あなたが与えたコードでは、呼び出し元のメソッドでそれを行う理由はないようです。

于 2012-08-09T13:57:25.387 に答える