using System.Threading.Tasks;
using Dexih.Utils.ManagedTasks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
namespace ManagedTaskDemo
static async Task Main(string[] args)
var hostBuilder = new HostBuilder()
.ConfigureServices((hostContext, services) =>
services.AddSingleton<IManagedTasks, ManagedTasks>();
services.AddHostedService<TaskService>();
var host = hostBuilder.Build();
public class TaskService : IHostedService
private readonly IManagedTasks _managedTasks;
public TaskService(IManagedTasks managedTasks)
_managedTasks = managedTasks;
managedTasks.OnStatus += TaskStatusChange;
managedTasks.OnProgress += TaskProgressChange;
public Task StartAsync(CancellationToken cancellationToken)
_managedTasks.Add(new ManagedTask()
TaskId = Guid.NewGuid().ToString(),
ManagedObject = new CountTask(),
Triggers = new [] { new ManagedTaskTrigger(TimeSpan.FromSeconds(10), 1000)}
return Task.CompletedTask;
public Task StopAsync(CancellationToken cancellationToken)
return Task.CompletedTask;
private void TaskStatusChange(ManagedTask value, EManagedTaskStatus managedTaskStatus)
Console.WriteLine($"Task Status: {value.Name}, Status: {managedTaskStatus}");
private void TaskProgressChange(ManagedTask value, ManagedTaskProgressItem progressItem)
Console.WriteLine($"Task Progress: {value.Name}, Step: {progressItem.StepName}");
public class CountTask : ManagedObject
public override async Task StartAsync(ManagedTaskProgress progress, CancellationToken cancellationToken = default)
for (var i = 0; i < 5; i++)
await Task.Delay(1000, cancellationToken);
progress.Report( $"step: {i+1}");