I have some library (socket networking) code that provides a Task-based API for pending responses to requests, based on TaskCompletionSource
What about instead of doing
var task = source.Task;
you do this instead
var task = source.Task.ContinueWith( x => x.Result );
Thus you are always adding one continuation which will be executed asynchronously and then it doesn't matter if the subscribers want a continuation in the same context. It's sort of currying the task, isn't it?