Can't you replace
protected abstract Task StartCore(CancellationToken cancellationToken);
with
protected abstract void StartCore(CancellationToken cancellationToken);
and call it as
Task.Run(() => {
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 => 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 beastbest 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.