1

我有一个 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)
        {
            ...
        }

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

4

2 回答 2

1

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

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

查看有关此问题的更多信息:如何选择性地在后台线程上运行一些代码?

于 2012-10-25T15:51:00.167 回答
0

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

编辑:

Task postcodeTask = new Task(() => PostcodeSearcher.PostcodeEmailer(_Companies, _FormInfo));
postcodeTask.Start();
于 2012-10-25T15:33:37.643 回答