Old-way of asynchronous programming in ASP.NET MVC 3
There is a lot of code repetition. I would create a custom class that inherits from Task and make it generic enough so you can have an array of your custom class and just loop through that array to do what you need to do.

class TaskController&lt;T&gt; : Task&lt;T&gt;
{
    public TaskController(AsyncManager asyncManager, string asyncManagerParameter, Func&lt;T&gt; callback) : base(callback)
    {
        this.ContinueWith(t =&gt;
        {
            //just for demonstration
            Console.WriteLine(t.Result);

            // Do some work with your asyncManager
            asyncManager.Parameters[asyncManagerParameter] = t.Result.ToString();
        });
    }
}


I would also have GetResponse take a string uri as parameter instead of making a new GetResponse for each url that you want to use. 

public static string GetResponse(string uri)
{
    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(uri);
    req.Method = "HEAD";

    HttpWebResponse resp = (HttpWebResponse)req.GetResponse();

    return resp.Headers.ToString(); // just changed this for demonstration purposes
}


and finally I would use it like this

AsyncManager asyncManager = new AsyncManager();

TaskController&lt;string&gt;[] taskControllers = {
    new TaskController&lt;string&gt;(asyncManager, "header1", () =&gt; GetResponse("http://google.com")),
    new TaskController&lt;string&gt;(asyncManager, "header3", () =&gt; GetResponse("http://www.twitter.com"))
};

foreach (TaskController&lt;string&gt; tc in taskControllers)
{
    tc.Start();
}


It is much less code, you can reuse it later, you can very easily add a new TaskController if you want to work with another URL, and it's a lot more readable.

To use this you will need to just edit this.ContinueWith inside TaskController and have it do whatever you want (decrement, etc)