No, the title is not a typo. There is so much noise around Node.js, I thought it would be fun to make a sample of how it would work in C# using the TPL. Here is how the hello world sample would look like:

public class HelloHandler : AbstractAsyncHandler { protected override Task ProcessRequestAsync(HttpContext context) { context.Response.ContentType = "text/plain" ; return context.Response.Output.WriteAsync( "Hello World!" ); } }

And the code to make this happen:

public abstract class AbstractAsyncHandler : IHttpAsyncHandler { protected abstract Task ProcessRequestAsync(HttpContext context); private Task ProcessRequestAsync(HttpContext context, AsyncCallback cb) { return ProcessRequestAsync(context) .ContinueWith(task => cb(task)); } public void ProcessRequest(HttpContext context) { ProcessRequestAsync(context).Wait(); } public bool IsReusable { get { return true ; } } public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData) { return ProcessRequestAsync(context, cb); } public void EndProcessRequest(IAsyncResult result) { if (result == null ) return ; ((Task)result).Dispose(); } }

And you are pretty much done. I combined this with a HttpHandlerFactory which does the routing, and you get fully async, and quite beautiful code.