Chaining asynchronous tasks that must run sequentially
I would use lock instead of Interlocked, because its much easier to follow and debug. Unless you are after some kind of micro optimization, I think you should keep it simple:

lock (lock)
{
    if (lastTask == null)
    {
       task.Start(scheduler);
    } 
    else 
    {
        lastTask.ContinueWith(...);
    }
    lastTask = task;
}

I think you can modify your lambda expression to get a current task:

Task task = null;
task = new Task ((action) =&gt; 
     {
         CurrentTask = task;
         ((Action&lt;T&gt;)action) (wrappedValue);
     }, operation);


Though I am not too experienced with TPL, so there might be an easier way.