定时器在完成发送电子邮件之前

时间:2012-11-05 14:37:53

标签: c# exception timer sendmail

我必须在计时器正文中发送电子邮件,在c#应用程序中,计时器间隔为2秒

try
{
    string[] filePaths = Directory.GetFiles(@"D:\ISS_Homewrok\");
    foreach (string filePath in filePaths)
    {
        SendEmail(filePath);
        File.Delete(filePath);
    }
}
catch (Exception ex)
{
    MessageBox.Show(ex.ToString());
}

删除文件时会抛出此异常

    System.IO.IOException: The process cannot access the file 'D:\ISS_Homewrok\KeyBoardMovements1.txt' because it is being used by another process.
 at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.File.Delete(String path)
   at ISS_Homework.Form1.timer_tick(Object sender, ElapsedEventArgs e)

SendEmail方法是:

private void SendEmail(string p)
    {
        SmtpClient smtp;
        //Detailed Method
        MailAddress mailfrom = new MailAddress("samahnizam@gmail.com");
        MailAddress mailto = new MailAddress("rubaabuoturab@gmail.com");
        MailMessage newmsg = new MailMessage(mailfrom, mailto);
        newmsg.Subject = "Tracker";
        //For File Attachment, more file can also be attached
        try
        {
            Attachment att = new Attachment(p);
            newmsg.Attachments.Add(att);
            smtp = new SmtpClient("smtp.gmail.com", 587);
            smtp.UseDefaultCredentials = false;
            smtp.Credentials = new NetworkCredential("XXXXX", "XXXXX");
            smtp.EnableSsl = true;
            smtp.Send(newmsg);
        }
        catch (Exception ex)
        {
        }
    }

修改 我已经将计时器的间隔设为1分钟,异常仍然被抛出! 请帮忙。

3 个答案:

答案 0 :(得分:0)

您可以尝试使用计时器功能

timer.Stop();
try
{
    string[] filePaths = Directory.GetFiles(@"D:\ISS_Homewrok\");
    foreach (string filePath in filePaths)
    {
        SendEmail(filePath);
        File.Delete(filePath);
    }
}
catch (Exception ex)
{
    MessageBox.Show(ex.ToString());
}
timer.Start();

答案 1 :(得分:0)

我猜你正在尝试在处理旧请求时发送新邮件。当两个证据都试图访问文件时,它将崩溃。 解: 在backgroundworker.dowork程序中包装您的函数。每次计时器触发时,它都可以检查backgroundworker.isbusy方法以检查旧进程是否已完成。如果没有,只需等待两秒钟。

没有代码,因为我在Vb.net中编程

答案 2 :(得分:0)

你使用什么样的计时器? .Net框架中有四种不同类型的Timer,其中一些产生新线程来处理Elapsed / Tick事件。

在这种情况下,我怀疑发送所有电子邮件所需的时间比计时器滴答之间的时间间隔要长。如果您正在使用其中一个线程计时器,那么您的文件将被多个计时器线程同时读取。请参阅MSDN上的文档:

  

提升Elapsed事件的信号始终排队等待执行   在ThreadPool线程上,事件处理方法可能在一个线程上运行   调用Stop方法的同时运行另一个   线。这可能导致在之后引发Elapsed事件   调用Stop方法。下一节中的代码示例显示了一个   解决这种竞争状况的方法。

我要做的是在例行程序的开头设置一个标志,指示进程当前正在运行,如果是这样的话就退出:

if (_isRunning)
    return;

try
{
    _isRunning = true;
    string[] filePaths = Directory.GetFiles(@"D:\ISS_Homewrok\");
    foreach (string filePath in filePaths)
    {
        SendEmail(filePath);
        File.Delete(filePath);
    }
}
catch (Exception ex)
{
    MessageBox.Show(ex.ToString());
}
finally
{  _isRunning = false; }