https://bugzilla.novell.com/show_bug.cgi?id=357649


           Summary: GC Error: The object was used after being disposed.
           Product: Mono: Runtime
           Version: 1.2.6
          Platform: x86-64
        OS/Version: Linux
            Status: NEW
          Severity: Critical
          Priority: P5 - None
         Component: GC
        AssignedTo: [EMAIL PROTECTED]
        ReportedBy: [EMAIL PROTECTED]
         QAContact: [email protected]
                CC: [EMAIL PROTECTED]
          Found By: Other


Unhandled Exception: System.ObjectDisposedException: The object was used after
being disposed.
  at System.IO.StreamWriter.Write (System.String value) [0x00000] 
  at System.IO.TextWriter.WriteLine (System.String value) [0x00000] 
  at mdu.Mailer.SendMail (System.String users, System.String TextMessage,
System.String HTMLMessage) [0x00000] 
  at mdu.Reporter.SendReport (mdu.UserDictionary Users, System.String
EMailList) [0x00000] 
  at mdu.Program.ProcessDirectory (System.IO.DirectoryInfo Dir, System.String
DefaultUser) [0x00000] 
  at mdu.Program.ProcessDirectory (System.IO.DirectoryInfo Dir, System.String
DefaultUser) [0x00000] 
  at mdu.Program.Main (System.String[] args) [0x00000]

code in question:
----------------------
static public void SendMail(string users, string TextMessage, string
HTMLMessage)

{

    StreamWriter sw;

    if (string.IsNullOrEmpty(Configuration.MailDir))

    {

        Process myProcess = new Process();

        myProcess.StartInfo.FileName = "/usr/sbin/sendmail";

        myProcess.StartInfo.Arguments = string.Format("-f {0} -- {1}",

            Configuration.SanitizeEmails(Configuration.Sender, ""),

            Configuration.SanitizeEmails(users, " "));

        myProcess.StartInfo.UseShellExecute = false;

        myProcess.StartInfo.RedirectStandardInput = true;

        myProcess.Start();

        sw = myProcess.StandardInput;

    }

    else

        sw = new StreamWriter(Path.Combine(Configuration.MailDir,

                                           string.Format("{0}{1}.eml",
C++.ToString("000"), users)));

    string line;

    using (StreamReader sr = new StreamReader(Configuration.EMailTemplate))

        while ((line = sr.ReadLine()) != null)

            sw.WriteLine(line.Replace("%%TEXT%%", TextMessage)

                             .Replace("%%HTML%%", HTMLMessage)

                             .Replace("%%USERS%%",
Configuration.SanitizeEmails(users, ", "))

                             .Replace("%%SENDER%%",
Configuration.SanitizeEmails(Configuration.Sender, "")));

    sw.Close();

    sw.Dispose();

}


----------------------

I think this happens because:
* the variable myProcess goes out of scope
* GC collection occurs before sw.WriteLine is called.

But the GC should keep the stream myProcess.StandardInput because it's
referenced by sw. Isn't it?

In the meantime I'm gonna move the declaration of myProcess out to the parent
block to workaround this.


-- 
Configure bugmail: https://bugzilla.novell.com/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the QA contact for the bug.
_______________________________________________
mono-bugs maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-bugs

Reply via email to