从调用者处理被调用方法中的流

时间:2012-08-09 13:52:58

标签: c# stream dispose

我正在寻找一种处理一系列对象的好方法,所以如果我在底层流中使用using语句来创建附件,那么问题出现在GetMessage中...当我去发送方法1时邮件消息附件流被丢弃并将收到错误。如果我取消使用的语句,它可以找到,但我还没有正确处理DataStream Dest。我最初的方法是向方法一添加一个参数List,我可以在每次调用GetMessage时添加Dest,并在方法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,我必须更改所有其他对象上的所有其他对象实现。我宁愿让发送消息处理newtype5的处理,因为从批处理它可以被调用500次。这是否使示例更加清晰。发送消息已经编写实现,是针对具有GetMessage实现的其他几个对象实现的。我恰好使用了一个流,在发送之前我无法处理流。

2 个答案:

答案 0 :(得分:1)

我建议您在Method2中执行MailMessage.Send;使用你给出的代码似乎没有任何理由在调用方法中这样做。

答案 1 :(得分: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()方法是异步的吗?你想并行化发送吗?