代码之家  ›  专栏  ›  技术社区  ›  Marko

在后台发送大量电子邮件-创建线程还是使用线程池?

  •  0
  • Marko  · 技术社区  · 14 年前

    我有一个应用程序,其中的一个操作会触发许多要发送的电子邮件。电子邮件的数量是可变的,可以是10到1000个 每次操作 .

    悬挂

    我过去没有用过线,所以我需要你的帮助。您是手动创建线程还是使用线程池?我希望这项任务是低优先级的,使用尽可能少的资源,因为我不介意即使电子邮件晚了1小时。


    马尔科

    5 回复  |  直到 14 年前
        1
  •  1
  •   uvita    14 年前

    这是另一个建议。。。 如果您使用的是数据库,请创建一个与需要发送和使用的消息相关的任务(即创建一个表示要完成的任务的表) Quartz.NET 或者类似的(您也可以创建一个Windows服务)来查找未完成的任务并执行它们(如果成功执行,则将它们标记为已完成)。

        2
  •  3
  •   Community M-A    7 年前

    事实上,在ASP.NET中使用线程并不是一个好主意。当请求结束并发回给用户时,Asp.net会处理大量资源。因为您不希望用户等待,所以您将遇到这样一个场景,在该场景中,您认为可以安全使用的ASP.NET对象将被真正释放。

    关于WCF入门的页面:

    http://bloggingabout.net/blogs/dennis/archive/2007/04/20/wcf-simple-example.aspx

    http://msdn.microsoft.com/en-us/library/bb332338.aspx

    http://www.c-sharpcorner.com/Articles/ArticleListing.aspx?SectionID=1&SubSectionID=192

    How to start using WCF/WPF?

        3
  •  0
  •   Wildhorn    14 年前

        4
  •  0
  •   Albin Sunnanbo    14 年前

    你可以简单地使用 BackgroundWorker 上课。

    编辑:

    编辑2:
    如果你想同时发送许多邮件,你可以查看 Task Parallel Library .

        5
  •  0
  •   Scott P    14 年前

    您可以使用任务派生出工作线程来处理电子邮件。

    如果这对CPU造成了太大的冲击,您可以创建一个新的调度程序来减少并发性: http://msdn.microsoft.com/en-us/library/ee789351.aspx

    static void StartMailTasks(string[] addresses)
    {
        List<Task> tasks = new List<Task>();
        foreach (var address in addresses)
        {
            tasks.Add(Task.Factory.StartNew(Email, address));
        }
    
        Task.Factory.ContinueWhenAll(tasks.ToArray(), AllDone, TaskContinuationOptions.OnlyOnRanToCompletion);
        Task.Factory.ContinueWhenAny(tasks.ToArray(), ReportError, TaskContinuationOptions.OnlyOnFaulted);
    }
    
    static void AllDone(Task[] tasks)
    {
        // All is well
    }
    
    static void ReportError(Task errorTask)
    {
        // Log or report the error
    }
    
    static void Email(object state )
    {
        // send the e-mail  
        // Can throw error, if needed
    }