【问题标题】:using async methods asp.net?使用异步方法asp.net?
【发布时间】:2010-07-15 16:29:08
【问题描述】:

我在页面上有两种方法。一个 AddMessageToInboxOutbox(params[]) 和另一个 SendNewMessageMail(params[])。

一旦用户向其他人发送消息,其他第一条消息将被添加到数据库,然后发送到收件人的电子邮件。有时 SMTP 负载很重,需要 5 秒才能得到答复。我想使用其他线程或其他东西将 SendNewMessageMail(params[]) 与异步调用封装起来。我从来没有这样做过。

如何在 ASP.NET 中直接执行此操作?

【问题讨论】:

    标签: c# asp.net vb.net


    【解决方案1】:

    您可以使用委托异步调用方法:

    delegate void SendMailAsync(params object[] args);
    
    static void Main()
    {
        SendMailAsync del = new SendMailAsync(SendMail);
        del.BeginInvoke(new object[] { "emailAddress" }, null, null);
    }
    
    static void SendMail(params object[] args)
    {
        // Send
    }
    

    这将使用ThreadPool 分配另一个线程。在我的示例中,我也没有注册回调。请注意,此回调(如果指定)将被放置到未知的ThreadPool 线程上。在委托引用 del 上调用 EndInvoke 将阻塞,直到完成。

    EndInvoke 采用从BeginInvoke 方法返回的IAsyncResult 对象,如果这样做,请保留对delIAsyncResult 的引用。此外,这并不特定于 ASP.NET。

    注意:多线程是一种强大的机制,也是一门需要深入学习的学科。由于页面生命周期等原因,将多线程与 ASP.NET 耦合可以说比 WinForms 应用程序更复杂。我建议您也阅读整个多线程主题。

    【讨论】:

    • 将在 ASP.NET 应用程序中使用它。关键是当页面回发时会发生什么? ASync 调用会继续运行吗?
    • 如果页面加载没有阻塞返回并且页面返回给客户端,我认为它会运行但结果将毫无意义,因为页面生命周期已经完成并回收。但是,如果不需要返回,它可能仍然完成(不确定线程​​中止等)。试试看,让我们知道 :-) 你可以通过 Thread.Sleep() 模拟很长时间来模拟一个未完成的线程。
    【解决方案2】:

    或者,看看ParamaterizedThreadStart

    【讨论】:

    • 这样我就可以打开新的 Thread 用于邮件本身并保留其余功能?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-09
    • 2017-11-23
    • 1970-01-01
    • 2011-11-01
    • 2015-04-10
    • 2018-04-30
    • 1970-01-01
    相关资源
    最近更新 更多