asp.net中带有c#的计划电子邮件-代码隐藏中的哪个事件或位置

asp.net中带有c#的计划电子邮件-代码隐藏中的哪个事件或位置,c#,asp.net,email,scheduled-tasks,C#,Asp.net,Email,Scheduled Tasks,我想在每天的特定时间向我的所有用户发送预定的电子邮件 我应该使用哪个事件或哪个位置以代码隐藏方式发送它们? 我的网页是基于母版和内容页 我应该使用母版页或内容页的页面加载(Default.aspx)/还是使用global.asax 提前感谢您应该使用global.asax,在启动时启动一个线程,并利用一段时间发送电子邮件。当应用程序关闭时停止线程 您必须使应用程序保持活动状态才能使线程保持活动状态。如果您长时间没有收到任何请求,您的应用程序将被iis服务器关闭,您将不会发送电子邮件 比如:

我想在每天的特定时间向我的所有用户发送预定的电子邮件
我应该使用哪个事件或哪个位置以代码隐藏方式发送它们?
我的网页是基于母版和内容页
我应该使用母版页或内容页的页面加载(Default.aspx)/还是使用global.asax


提前感谢

您应该使用global.asax,在启动时启动一个线程,并利用一段时间发送电子邮件。当应用程序关闭时停止线程

您必须使应用程序保持活动状态才能使线程保持活动状态。如果您长时间没有收到任何请求,您的应用程序将被iis服务器关闭,您将不会发送电子邮件

比如:

    private static bool stopProcessing;
    private static object __batchProcessLock;
    private static const int sleeptime = 2500;//2.5 seconds

    protected void Application_Start(object sender, EventArgs e)
    {
        Thread BatchThread = new Thread(Start);
    }

    protected void Application_End(object sender, EventArgs e)
    {
        Stop();
    }


    private static void Start()
    {
        lock (__batchProcessLock) // Be sure to run this only once in the application
        { 
            stopProcessing = false;
            while (!stopProcessing)
            {
                try
                {
                    //Do you stuff (check if it is time to send emails)
                }
                catch (Exception ex)
                {
                    //handle exception
                }
                Sleep(sleeptime); 
            }
        }
    }


    private static void Stop()
    {
        stopProcessing = true;
    }

除了@Peer的建议外,另一个选择是在每个请求上运行一些代码,这取决于站点的流量以及您的时间安排的准确性。该代码将检查定时活动最后一次运行的时间(通过签入数据库或其他方式),然后如果它已过今天的发送时间,但尚未发送,则运行发送过程。否则你就照常干了

当然,您需要生成一个新线程来完成这项工作,这样您就不会在用户请求发送电子邮件时阻塞它

这种方法的缺点是它依赖于有人点击你的网站来触发。这种方法的优点是它可以在没有任何特殊代码的情况下很晚运行。使用计时器的方法需要在第一次检查时附加代码,以便基本上执行此处所做的操作,以检查启动时是否发生了今天的运行

我要再说一遍,我不认为这是最好的方式,但如果它绝对必须通过ASP.NET网页,那么这可能是你最好的选择

不过,如果允许您使用ASP.NET以外的其他代码,那么您可以编写一个应用程序,在正确的时间以特殊页面的形式进入您的网站,并将计时器代码保留在您计算机(或服务器或其他)上的应用程序上。特殊页面将使用某种安全性来确保只有您才能访问它(如密码保护或类似),当您点击该页面时,它会执行电子邮件操作。通过这种方式,电子邮件代码位于ASP.NET页面中,但实际调度代码位于更合理的位置


这当然也不是一个选项。

一般来说,我认为您不希望asp.net页面运行计划作业。从服务到标准windows计划任务,使用应用程序执行计划的任何操作。有很多方法可以解决在网页上执行此操作的一些问题,但您不应该这样做。谢谢您的评论/您是对的/但我正在asp.net网页中寻找一种方法…谢谢您的回答/但是在应用程序启动或应用程序启动请求中的哪个事件->呢?/但此事件中的代码只运行一次!我如何强制该事件每天(反复)在特定时间运行?正如@peer所说,您可以使用设置计时器(System.Timers.timer,我相信),然后执行您想要的操作。如果你的应用程序由于不活动或类似原因而关闭,那么你会遇到麻烦,因此你可能希望大幅延长网站的超时时间。或者每10分钟有一次第二次点击你的某个页面,以保持你的网站的活力。你可以让windows服务绕过应用程序关闭。但是,如果用户群稳定,则关闭不会有太大问题。使用“仅运行一次启动”可以通过使用if语句将锁更改为Monitor.TryEnter来解决该问题。如果它得到了锁,它会做你在那里得到的,如果它没有得到锁,它只会返回。因此,在start上进一步点击将什么也做不了……您是对的,如果代码正确,它将运行一次。但是如果有人改变它,并将启动触发器移动到其他地方,你可能会遇到大麻烦(多次发送电子邮件,等等)。这只是为了让代码变得愚蠢。它实际上应该记录被锁定的代码,这样您就知道代码中有问题。这只是一个快速的样本。没有生产代码。