在ASP.NET WebService中启动一个线程

时间:2012-09-17 18:18:05

标签: asp.net multithreading wcf asynchronous

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

它有一个方法(我们称之为“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服务来与之通信?

1 个答案:

答案 0 :(得分:0)

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

如果您不能等待,那么邮件流程的最佳选择是以下之一

  1. Windows服务。
  2. .ashx您可以使用jquery ajax调用从客户端代码调用,传递必要的数据以发送邮件。
  3. 批处理作业(计划任务,SQL服务器作业等),用于读取要从数据库发送的待处理邮件并发送它们。它会每X分钟运行一次,所以你不必担心
  4. 希望有所帮助!