2016-03-01 65 views
-2

我有一個文件,到數據保存在所有的時間.. 我有一個運行一次,每4秒 我的過程看起來像一個計時器: 文件x.txt是開放所有的時間。 4秒後我想要停止該進程並通過電子郵件發送此文件。 我想重複上述步驟。定時器和螺紋鎖

我的代碼:

var timer = new System.Timers.Timer(4000); 
     timer.Enabled = true; 
     timer.Elapsed += (object sender, System.Timers.ElapsedEventArgs e) => 
     { 
      wrtiteToFile.Suspend(); 

      SendEmail(); 
      wrtiteToFile.Resume(); 

     }; 

    static void SendEmail() 
    { 
     SmtpClient smtpClient = new SmtpClient(); 
     NetworkCredential basicCredential = 
      new NetworkCredential("", ""); 
     MailMessage message = new MailMessage(); 
     MailAddress fromAddress = new MailAddress(""); 
     smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network; 
     smtpClient.Port = ; 
     smtpClient.Host = ""; 
     smtpClient.UseDefaultCredentials = false; 
     smtpClient.Credentials = basicCredential; 
     smtpClient.EnableSsl = true; 


     message.From = fromAddress; 
     message.Subject = ""; 
     //Set IsBodyHtml to true means you can send HTML email. 
     message.IsBodyHtml = true; 
     message.Body = ""; 
     message.To.Add(""); 
     message.Attachments.Add(new Attachment(Application.StartupPath + @"\log.txt")); 


     smtpClient.Send(message); 
    } 

該進程無法訪問文件 'C:\ log.txt的',因爲它正由另一個進程使用。 這不起作用。我能做到這一點的最佳方式是什麼?我試過鎖定,但它不起作用。 我必須使用.net框架2.0

+2

你是如何打開你的文件,並在你的sendemail函數什麼 – BugFinder

+0

@Stefan如果是,它不是一個很好的。只是發送垃圾郵件的垃圾郵件可能會因爲垃圾郵件過濾器等而無法發送垃圾郵件。 – Jacobr365

+0

我想,發送郵件的程序使用你的'x.txt'。請分享'SendEmail()' –

回答

2

你沒有處理你的資源。這種方式不確定何時釋放資源(文件鎖定)。

你應該正確處理資源。 (聲明,我沒有檢查這一點)

static void SendEmail() 
{ 
    using (SmtpClient smtpClient = new SmtpClient()) 
    using (MailMessage message = new MailMessage()) 
    using (Attachment attachment = new Attachment(Application.StartupPath + @"\log.txt")) 
    { 
     NetworkCredential basicCredential = 
      new NetworkCredential("", ""); 

     MailAddress fromAddress = new MailAddress(""); 
     smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network; 
     smtpClient.Port = ""; 
     smtpClient.Host = ""; 
     smtpClient.UseDefaultCredentials = false; 
     smtpClient.Credentials = basicCredential; 
     smtpClient.EnableSsl = true; 

     message.From = fromAddress; 
     message.Subject = ""; 
     //Set IsBodyHtml to true means you can send HTML email. 
     message.IsBodyHtml = true; 
     message.Body = ""; 
     message.To.Add(""); 
     message.Attachments.Add(attachment); 


     smtpClient.Send(message); 
    } 
} 

using語句將隱式調用一次性物品的Dispose方法,因此,釋放文件句柄和其他類型的連接。

0

您的SendMail方法塊文件。最簡單的方法修復:)

var timer = new System.Timers.Timer(4000); 
    timer.Enabled = true; 
    timer.Elapsed += (object sender, System.Timers.ElapsedEventArgs e) => 
    { 
     timer.Enabled = false; 
     wrtiteToFile.Suspend(); 
     SendEmail(); 
     wrtiteToFile.Resume(); 
     timer.Enabled = true; 

    };