需要关于背景工作者的建议

时间:2011-05-25 05:18:56

标签: c# multithreading wcf backgroundworker scheduled-tasks

我想开发一个交付应用程序(自托管WCF服务),它允许安排电子邮件。用户将为电子邮件分配计划并发送。 WCF服务应该能够选择电子邮件并在预定时间发送。

我在这里使用什么方法?我正在考虑关注替代方案

  1. 使用后台工作线程执行此任务
  2. 任何第三方日程安排服务(我尚未对此进行调查)
  3. 除了上面提到的两个之外,有人可以建议我一个可能的解决方案吗?

    [编辑]:我可以使用SQL代理吗?

    谢谢,

    拉​​姆

3 个答案:

答案 0 :(得分:1)

让您的WCF服务将电子邮件请求排队到数据库表。然后编写一个Windows服务,定期扫描表,发送电子邮件,然后用结果更新表。

如果您使用的是SQL Server,则可以直接从中发送电子邮件,并安排作业发送电子邮件,从而使您无需部署Windows服务。

答案 1 :(得分:0)

这取决于您的非功能性要求...... :-)

我可以想象你在这项服务中需要一些可靠性。 WCF服务的生命周期取决于其主机。例如。如果这是IIS,则应用程序池将在一定的空闲时间后回收(没有请求进入IIS)。这将恳求与后台工作者不同的解决方案。正如您所建议的,这可能是第三方调度程序,但Windows中也有调度程序。 (请参阅http://technet.microsoft.com/en-us/library/dd363786(WS.10).aspx)使用小型控制台程序,您可以让Windows计划程序调用您的服务,或者自行发送电子邮件。

答案 2 :(得分:0)

我看到了“......除了上面提到的两个......”但我认为没有别的办法来实现这个目标:) 在Windows服务中构建一个无限循环,如下所示:

private void DoTheThing()
    {
        try
        {
            while (true)
            {
                TheThing e = new TheThing();
                Thread t = new Thread(new ThreadStart(e.Run));
                t.Start();
                Thread.Sleep(1000);
            }
        }
        catch (ThreadAbortException) { }
        catch (Exception ex) { /* Whatever error handling you got */ }
    }

...其中TheThing有一个方法Run,可以每1秒执行一次所需的操作。这看起来很愚蠢(虽然(真的) - 是的,对,但是自从.NET 1.0以来至少在30台服务器上一直在不停地工作:)只需确保在新线程的Windows服务启动时调用此DoTheThing方法。

希望这会有所帮助:)