0

私は次のコードを手に入れました

protected override void Render(HtmlTextWriter writer) 
{

    // Write the HTML into this string builder

    StringBuilder sb = new StringBuilder();
    StringWriter sw = new StringWriter(sb);
    HtmlTextWriter hWriter = new HtmlTextWriter(sw);
    base.Render(hWriter);

    string pageHTML = sb.ToString(); 

    // Write it back to the server
    writer.Write(pageHTML);
    if (Convert.ToBoolean(this.ViewState["SendEmail"])) 
    {
        string HTML = "";
        HTML = "<!DOCTYPE HTML PUBLIC '-//IETF//DTD HTML//EN'>";
        HTML += "<html>";
        HTML += "<head>";
        HTML += "<meta http-equiv='Content-Type'";
        HTML += "content='text/html; charset=iso-8859-1'>";
        HTML += "<title>Order Information</title>";
        HTML += "</head>";
        HTML += "<body>";
        HTML += "See attachment for information.";
        HTML += "</body>";
        HTML += "</html>";

        MailMessage mail = new MailMessage("from@xxx.com", "to@xxx.com", "Subject", HTML);
        mail.IsBodyHtml = true;

        string path = @"d:\websites\plate.html";

        using (StreamWriter sw11 = File.CreateText(path))
        {
            sw11.WriteLine(pageHTML);
        }

        mail.Attachments.Add(new Attachment(path));

        SmtpClient client = new SmtpClient("192.168.1.127");

        client.Send( mail );

        Response.Write("<script>alert('Your information has been sent.')</script>");

        this.ViewState["SendEmail"] = false;
    }

}

ソリューションを新たにクリーンアップ/ビルドした後、送信ボタンを押すと、この関数が呼び出され、HTMLページが問題なくメールで添付ファイルとして送信されます。しかし、送信ボタンをもう一度押そうとすると、「System.IO.IOException:別のプロセスによって使用されているため、プロセスはファイル'd:\ website\plate.html'にアクセスできません」というメッセージが表示されます。ファイルを開こうとするとエラーが発生します。どうしたの?

4

3 に答える 3

2

SmtpClientはIDisposableを実装しますが、インスタンスを破棄していません。

http://msdn.microsoft.com/en-us/library/system.net.mail.smtpclient.aspx

そのため、ファイルを保持している可能性があります。

一般的に言えば、using特に理由がない限り、IDisposableを実装するものはすべてステートメントでラップするのが賢明です(たとえば、IDisposableインスタンスを保持するクラスを介してオブジェクトの存続期間を明示的に管理している場合)。

また、定数ファイル名を使用しているという@DanPichelmanのコメントにも注目したいのですが、このコードは別々のスレッドで並行して実行される可能性があります。これにより、最初のユーザーのコードが完了するまで、最初のユーザーを超えたすべてのユーザーの出力ファイルがロックされます。

于 2012-08-29T17:50:14.203 に答える
1

エリックが指摘したように、あなたは声明のSmtpClient中にあるべきですusing-同上MailMessage

ただし、明らかな理由もなく、ファイルシステムに書き込むことになります。最初にファイルを必要としないAttachmentコンストラクターの1つを使用することを強くお勧めします。たとえば、に書き込んで巻き戻し、それをに提供することができます。MemoryStreamAttachment

それ以外のことは別として、複数のスレッド(またはプロセス)がこのコードを同時に実行しようとしても問題がないことを意味します。

于 2012-08-29T17:53:28.510 に答える
-2

私はあなたがそれを閉じるべきだと思います:

using (StreamWriter sw11 = File.CreateText(path))
{
    sw11.WriteLine(pageHTML);
    sw11.Flush();
    sw11.Close();
}
于 2012-08-29T17:50:43.967 に答える