If I want to expose an API which internally Schedules a sequence of Tasks that should be cancellable by the user. e.g.
public ??? DoWork()
{
    Task t = new .... , myCancellationToken);
    return ???
}
What is the correct object to return for cancellation Control? Is it CancellationTokenSource ?
public CancellationTokenSource DoWork()
{
    CancellationTokenSource source = new ....
    Task t = new .... , source.Token);
    return source;
}
Should I return anything at all? Should I just accept a CancellationToken as an arg and let the user create the token source if needed?
public void DoWork(CancellationToken token)
{
    Task t = new .... , token);
}
What is the most idiomatic way to deal with this?
 
  
                     
                        
Should I just accept a CancellationToken as an arg and let the user create the token source if needed?
This. But you should quite possibly return a Task as well, so that the user can observe when it's completed etc. This is amenable to async/await as well, of course.
You may also want to have overloads:
public Task DoWork()
{
    return DoWork(CancellationToken.None);
}
public Task DoWork(CancellationToken cancellationToken)
{
    ...
}
See the Task-based Asynchronous Pattern for general conventions on this sort of thing.
 
                    See more on this question at Stackoverflow