Running async tasks and cancelling after a timeout if necessary
Can't you replace 


protected abstract Task StartCore(CancellationToken cancellationToken);



with

protected abstract void StartCore(CancellationToken cancellationToken); 


and call it as

Task.Run(() =&gt; {
                  try 
                  {
                      StartCore(cancellationToken);
                  }
                  catch
                  {
                     //logging
                     throw;
                  }
                });


? Why do you need async/await?



You don't really need a timer, you can use WaitAll overload that takes TimeSpan:

var tasks = processors.Select(p =&gt; p.Start(token.Token)).ToArray();
if (!Task.WaitAll(tasks, TimeSpan.FromSeconds(5)))
{
    token.Cancel();
    // wait for cancellation, if necessary
    // Task.WaitAll(tasks); 
}




You don't show your business logic and you don't say what kind of processing you are doing, so it's hard to tell whether inheritance is the best approach. It doesn't look like it based on your examples. Maybe it is better to have a single Processor class that would contain all the boiler-plate code you require (similar to BackgroundWorker) and inject StartCore as delegate/interface instead.