【问题标题】:Run background task with console application from asp.net使用来自 asp.net 的控制台应用程序运行后台任务
【发布时间】:2015-09-27 10:53:06
【问题描述】:

我的要求是在 Web 应用程序中从外部服务器发送电子邮件,平均需要大约 4 到 5 秒来处理和发送确认电子邮件。我不希望用户等待这个,所以我用 Process().StartInfo.Start() 触发了一个控制台应用程序,它在后台执行。问题是我可以依赖多少,因为在正常情况下,应用程序每天发送大约 10000 封电子邮件,而在高流量日它可能超过 80000。应用程序或服务器可能遇到哪些可能的问题/问题?有没有更好的解决方案?

【问题讨论】:

  • 您使用哪个 .NET 版本?
  • 你可以试试Task Class
  • 感谢马克西米利安的回复。该应用程序正在使用 .Net 框架 3.5
  • 遗憾的是 Task.NET 4 一起发布。但是你可以尝试打开一个线程而不是触发一个控制台应用程序。
  • 我们确实可以选择使用线程池或自定义线程,但这两种解决方案都有其自身的局限性。如果后台任务的数量超过一定数量,它可能会耗尽应用程序,并且在少数情况下可能会关闭应用程序池。此外,线程池通常具有最大线程数。如果所有线程都忙,则将其他任务放入队列中,直到它们可以在线程可用时提供服务。

标签: asp.net web-applications .net-3.5 background-task


【解决方案1】:

您可以使用以下方法来实现:

  1. 创建一个.aspx 页面并在此处写下您的业务代码(例如电子邮件 发送)

  2. 如果需要,请使用 Javascript 以及查询字符串中的参数调用此页面。您可以创建一个图像元素并将其来源设置为该页面。

    var img = new Image();
    img.scr = "perform-operation.aspx?[parametervalues]";
    

谢谢

【讨论】:

    【解决方案2】:

    控制台应用程序有一个缺点,如果您打算为每封电子邮件单独调用控制台应用程序,任何新进程都需要很长时间来加载和清理,这对 cpu 的开销太大。相反,最好的选择是在 IIS 中托管另一个网站,这个新网站将拥有自己的应用程序池,它将创建和托管进程。如果未提供任何请求,IIS 将关闭该进程。您可以通过为每个应用程序运行更多工作进程来设置 Web Farm。

    另一种选择是一直运行控制台或windows服务,让它在内存中,但有一个web服务主机监听电子邮件请求,如果从你的web应用程序收到请求,这个后台服务将发送电子邮件新线程并返回等待状态。基本上它是一个自托管的 WCF 服务。这与在 IIS 上托管另一个网站完全一样。

    我更喜欢基于 IIS 的托管,因为它易于设置,不需要任何额外的权限,并且将来要横向扩展,您可以轻松地将此邮件服务移动到其他服务器。

    【讨论】:

    • 既然说邮件要后台发送,那么这个新托管的网站如何与原应用进行实时通信呢?后台服务也是如此,Web 服务将如何监听 Web 应用程序中的事件?也许来自数据库?
    • 新创建的服务将托管一个 Web 服务,一种休息服务,您的 asp.net 应用程序应该调用 myotherapp.domain.com/sendemail?....,使用 WebClient 或 HttpClient。
    • 在这种情况下,它必须等到执行完成。
    • 不,您可以在 Web 服务应用程序中创建一个新的异步任务,然后您可以返回,但是这样做会创建一个新任务,但不在您自己的应用程序池中。这个想法是在单独的 Web 服务应用程序中分离邮件发送逻辑。
    • 当我们有多个任务正在运行并且我们异步调用它们并且它们将独立工作时,这会很有帮助,但是在这种情况下,我们有一个耗时的任务并且页面不会加载,除非任务完成了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 2011-01-22
    • 2011-02-10
    • 2022-01-14
    相关资源
    最近更新 更多