【问题标题】:ASP.NET MultithreadingASP.NET 多线程
【发布时间】:2012-10-25 23:51:00
【问题描述】:

我有一个 ASP.NET 页面,它向用户列表发送电子邮件 - 这个列表可能相当大,我们发现 ASP.NET 页面经常会超时。

我们想要做的是在一个新线程中发送这些电子邮件,这样当电子邮件进程在后台运行时,ASP.NET 页面会刷新给用户。

不过,我有点难以理解我需要做的事情。这是当前我的 ASP.NET 页面上的按钮单击事件:

    protected void btnSend_Click(object sender, EventArgs e)
    {    
        //Populate form data session
        _FormInfo = new Dictionary<string, string>();
        _FormInfo.Add("Name", txtName.Text);
        _FormInfo.Add("Postcode", txtPostcodeDone.Text);

        PostcodeSearcher.PostcodeEmailer(_Companies, _FormInfo);
        mv.ActiveViewIndex = 3;
    }

这是我要调用的方法(在 PostcodeSearcher 类中)

 public static void PostcodeEmailer(List<Company> companies, Dictionary<string, string> quote)
        {
            ...
        }

正如您所见,我需要在新线程中调用的方法需要接受参数——我在网上能找到的只是调用不带参数的新线程。有什么想法吗?

【问题讨论】:

标签: c# asp.net multithreading


【解决方案1】:

注意 IIS 杀死 ASP.NET 应用程序进程的问题,如果应用程序没有活动的用户请求,IIS 可以做到这一点(经过一些延迟,默认为 20 分钟)。这意味着您的后台线程可以在完成发送电子邮件的工作之前被杀死,而用户不会知道这一点。

要克服这个问题,您可以模拟用户请求,这样运行时就不会终止应用。其他选项(更好但更多工作)是创建一个单独的进程(例如 Windows“后台”服务),它将从 ASP.NET 应用程序(使用例如 WCF 服务)获取命令并将电子邮件发送给用户。要轻松创建 Windows 服务,请参见例如http://topshelf-project.com/

查看有关此问题的更多信息:How to optionally run some code on a background thread?

【讨论】:

  • 我支持基于服务的方法。 ASP.NET 页面根本不适合处理批量或长时间运行的进程。
【解决方案2】:

使用here 中的 C# 任务功能。这些对于执行异步命令非常有用(并且实现起来非常简单)。

编辑:

Task postcodeTask = new Task(() => PostcodeSearcher.PostcodeEmailer(_Companies, _FormInfo));
postcodeTask.Start();

【讨论】:

  • Task.Factory.StartNew(() =&gt; PostcodeSearcher.PostcodeEmailer(_Companies, _FormInfo));
  • "你甚至不需要为此使用任务工厂。" - 你为什么不使用它?
猜你喜欢
  • 2011-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多