我有一个 IIS 托管的 WCF 网络服务。
它上面有一个方法(我们称之为“ConfirmOrder”)。调用此方法时,我想 1. 对数据库执行一些快速操作,从而生成 OrderId 2. 启动一个新线程,该线程将执行一些缓慢的工作(例如生成一封电子邮件并发送它) 3. 从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 服务来与之通信?