我有一个托管在IIS上的WCF Web服务。
它有一个方法(我们称之为“ConfirmOrder”)。当调用此方法时,我想要做以下事情: 1. 快速更新数据库,生成OrderId。 2. 启动一个新线程进行一些慢工作(例如生成电子邮件并发送)。 3. 同步将步骤1中的OrderId返回给客户端。 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));
但是线程池的线程似乎在主线程完成后立即被终止,因为它是一个后台线程。有没有更好的方法解决这个问题 - 除了编写一个全新的 Windows 服务进行通信?