ASP.Net Web服务:异步运行代码

时间:2012-01-12 17:26:05

标签: asp.net .net-4.0

我有一个可以分为两个主要部分的Web服务:

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

  //Do stuff I care about
}

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

从Web服务中,建议的异步运行第二部分的方法是什么,以便让用户尽快回复他们的信息? BackgroundWorkerQueueUserWorkItem

2 个答案:

答案 0 :(得分:4)

您可能需要查看.NET 4.0新手的Tasks

它可以让您启动异步操作,但也可以让您轻松查看以后是否完成。

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

答案 1 :(得分:1)

启动新线程的最简单方法可能是:

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

但要小心 - 如果服务频繁受到攻击,你最终可能会创建大量相互阻塞的线程。