我有一个应用程序,其中一项操作触发了许多要发送的电子邮件。电子邮件的数量可变,可以从10到1,000 每个动作.

我不想申请 悬挂 在发送电子邮件(因此使用户烦恼)并希望将其发送到后台时。

我过去没有使用线程,所以这就是为什么我需要您的帮助。您是手动创建线程还是使用ThreadPool的好情况?我希望这项任务是低优先级,并且可以使用最少的资源,因为即使电子邮件迟到了1小时,我也不介意。

感谢你的帮助
马克

有帮助吗?

解决方案

这是另一个建议...如果您使用DB,请与需要发送和使用的消息相关的任务(即创建一个代表要完成的任务的表) Quartz.net 或类似的(您也可以创建Windows服务),以寻找不完整的任务并执行它们(如果成功执行执行,则将其标记为完成)。

其他提示

坦白说,在ASP.NET中穿线不是一个好主意。当请求结束并向用户发布时,ASP.NET会进行大量资源处置。由于您不希望用户等待,因此您会遇到这种情况,在这种情况下,您认为安全使用的ASP.NET对象确实被处置了。

您的最佳选择是创建外部服务(在IIS中运行的WCF服务,或具有WCF接口的Windows服务),.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

如何开始使用WCF/WPF?

因此,我的建议是使用ThreadPool。它可以让您排队所有的一切,以分别运行它们,从而使其使用较少的资源,但是当然,花更长的时间来处理所有内容,但是就像您说的那样,时间不是问题。

您可以简单地使用 背景工作者 班级。

链接的MSDN页面有一个很好的示例,其进度报告和取消操作的可能性。

编辑:
进度报告和取消可能在Web应用程序中不适合,但是背景工作人员可以通过为您创建线程来处理所有肮脏的东西。

edit2:
如果您想并行发送许多邮件,您可以查看 任务并行库.

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

如果这对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
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top