2012-01-12 58 views
6

我有一个Web服务,它可以分解为两个主要部分:ASP.Net Web服务:运行代码以异步方式

[WebMethod] 
MyServiceCall() 
{ 
    //Do stuff the client cares about 

    //Do stuff I care about 
} 

我希望做的是运行在另一个线程第二部分,这样客户端就不会等待它:一旦用户的逻辑完成,立即向他们发送他们的信息,但是继续处理我关心的东西(记录等)。

从Web服务,什么是运行第二张异步,以尽快获得用户回到他们的信息的推荐方法是什么? BackgroundWorkerQueueUserWorkItem

+2

你阅读本:http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background -tasks-in-asp-net.aspx – 2012-01-12 17:41:35

回答

4

你可能想看看Tasks这是新的.NET 4.0。

它可以让你开球异步操作,但也给你一个简单的方法,如果它做或不晚。

var task = Task.Factory.StartNew(() => DoSomeWork()); 

它会启动DoSomeWork()并继续而不用等待,因此您可以继续进行其他处理。当你到了一个你不想直到你的异步任务已经完成了到处理点,您可以拨打:

task.Wait(); 

这将等在那里,直到任务完成。如果你想从任务中得到结果,你可以这样做:

var task = Task.Factory.StartNew(() => 
{ 
    Thread.Sleep(3000); 
    return "dummy value"; 
}); 
Console.WriteLine(task.Result); 

调用task.Result块直到结果可用。

这里是一个涵盖了更详细的任务教程:http://www.codethinked.com/net-40-and-systemthreadingtasks

+0

接受这个答案;然而,我认为在阅读Darin Dimitrov的评论中的博客文章之后,我将暂缓实际执行此操作。听起来像这样做可能会有问题,如果它正在运行的域停止/回收 – John 2012-01-12 19:12:33

1

仍然发射一个新的线程,最简单的方法可能是:

new Thread(() => 
{ 
    /// do whatever you want here 
}).Start(); 

要小心,虽然 - 如果该服务被击中很频繁,你可能会风造就了不少,阻止对方的线程。