Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ASP.Net Web Service: Running code Asynchronously

I have a web service that can be broken down into two main sections:

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

  //Do stuff I care about
}

What I'd like to do is run that 2nd part on another thread, so that the client isn't waiting on it: once the user's logic has completed, send them their information immediately, but continue processing the stuff I care about (logging, etc).

From a web service, what is the recommended way of running that 2nd piece asynchronously, to get the user back their information as quickly as possible? BackgroundWorker? QueueUserWorkItem?

like image 209
John Avatar asked Jan 12 '12 17:01

John


People also ask

Is ASP NET asynchronous?

The . NET Framework 4 introduced an asynchronous programming concept referred to as a Task and ASP.NET 4.5 supports Task. Tasks are represented by the Task type and related types in the System.

How do you call a Web service method asynchronously in C#?

Asynchronous web service execution requires a two-step process. First, you tell the Web service to begin execution by calling the Begin method. The second step, calling the End method, completes the web service call and returns the response. To call a web service asynchronously, a client thread can use a WaitHandle.

Should Web API be async?

In the context of Web API, Asynchronous programming is used to improve the scalability of the application. By applying asynchronous programming using async and await there won't be any direct performance gain in speed instead application will be able to handle more concurrent requests.

Is ASP NET core asynchronous?

All I/O in ASP.NET Core is asynchronous. Servers implement the Stream interface, which has both synchronous and asynchronous overloads. The asynchronous ones should be preferred to avoid blocking thread pool threads. Blocking threads can lead to thread pool starvation.


2 Answers

You may want to look into Tasks which are new to .NET 4.0.

It lets you kick off an asynchronous operation, but also gives you an easy way to see if it's done or not later.

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

It'll kick off DoSomeWork() and continue without waiting so you can continue doing your other processing. When you get to the point where you don't want to process anymore until your asynchronous task has finished, you can call:

task.Wait();

Which will wait there until the task has completed. If you want to get a result back from the task, you can do this:

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

A call to task.Result blocks until the result is available.

Here's a tutorial that covers Tasks in greater detail: http://www.codethinked.com/net-40-and-systemthreadingtasks

like image 106
Joel Beckham Avatar answered Oct 11 '22 08:10

Joel Beckham


The easiest way to fire off a new thread is probably:

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

Be careful, though - if the service is hit very frequently, you could wind up creating a lot of threads that block each other.

like image 44
3Dave Avatar answered Oct 11 '22 08:10

3Dave