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

Joh*_*ohn 6 asp.net .net-4.0

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

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

  //Do stuff I care about
}
Run Code Online (Sandbox Code Playgroud)

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

从Web服务,以异步方式运行第二部分的推荐方法是什么,以便尽快让用户返回信息? BackgroundWorkerQueueUserWorkItem

Joe*_*ham 4

您可能想要研究.NET 4.0 的新增任务。

它允许您启动异步操作,而且还为您提供了一种简单的方法来查看它是否已完成。

var task = Task.Factory.StartNew(() => DoSomeWork());
Run Code Online (Sandbox Code Playgroud)

它将启动 DoSomeWork() 并继续而不等待,以便您可以继续进行其他处理。当您不想再处理直到异步任务完成时,您可以调用:

task.Wait();
Run Code Online (Sandbox Code Playgroud)

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

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

对 task.Result 的调用会阻塞,直到结果可用。

以下教程更详细地介绍了任务:http ://www.codethinked.com/net-40-and-systemthreadingtasks