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.