【问题标题】:Starting a thread in an ASP.NET WebService在 ASP.NET WebService 中启动线程
【发布时间】:2012-09-17 18:18:05
【问题描述】:

我有一个 IIS 托管的 WCF 网络服务。

它上面有一个方法(我们称之为“ConfirmOrder”)。调用此方法时,我想 1.对数据库做一些快速的事情,产生一个OrderId 2. 启动一个新线程,它会做一些缓慢的工作(例如,生成一封电子邮件并发送它) 3.将OrderId从1.同步返回给客户端。 4. 最终,当它完成时,在 2. 中创建的新线程将完成所有其余的处理并发送电子邮件。

问题:

(1) 我确实有类似的代码:

// do printing and other tasks 
OrderConfirmedThreadHelper helper = new OrderConfirmedThreadHelper(userSession, result);
// some things first (like generating barcodes) in this thread 
Logger.Write(basket.SessionId, String.Format("Before ConfirmOrderSync"), LogCategoryEnum.Sales, System.Diagnostics.TraceEventType.Verbose);
helper.ConfirmOrderSync();
Logger.Write(basket.SessionId, String.Format("After ConfirmOrderSync"), LogCategoryEnum.Sales, System.Diagnostics.TraceEventType.Verbose);
// slower things (like rendering, sending email) in a separate thread
Thread helperThread = new Thread(new ThreadStart(helper.ConfirmOrderAsync));
helperThread.Start();
return result;

但它似乎引起了问题;至少,该服务一直处于锁定状态。这是一件坏事吗?

(2) 我尝试将其更改为

// slower things (like rendering, sending email) in a separate thread            
ThreadPool.QueueUserWorkItem(new WaitCallback(helper.ConfirmOrderAsync));

但是 ThreadPool 线程似乎在主线程完成后立即被杀死,因为它是一个后台线程。

有没有更好的方法来做这件事 - 除了编写一个全新的 Windows 服务来与之通信吗?

【问题讨论】:

    标签: asp.net multithreading wcf asynchronous


    【解决方案1】:

    如果第二个线程在请求​​线程(来自浏览器的线程)之后完成,那么您就有问题了,因为它会被运行时回收并终止。 如果您可以等待(如果它只是要发送一封电子邮件,我将等待几秒钟)您可以使用 ManualResetEvent 同步一个线程以等待另一个线程完成并优雅地清理。

    如果你等不及了,那么在这种情况下,邮件处理的最佳选择是以下之一

    1. Windows 服务。
    2. 您可以从客户端代码调用一个 .ashx,并使用 jquery ajax 调用传递必要的数据以发送邮件。
    3. 一个批处理作业(计划任务、sql server 作业等),它读取要从数据库发送的待发送邮件并发送它们。它每 X 分钟运行一次,因此您不必担心

    希望有帮助!

    【讨论】:

    • 我想我将使用 Sql Server Service Broker 使用 SqlSependency 类在记录插入数据库并需要处理时通知 Windows 服务。
    • 其实我改变了主意。我正在编写需要对数据库执行的操作,然后将 XMPP 消息发送到将执行此操作的 Windows 服务。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-15
    相关资源
    最近更新 更多