/// <summary> /// Takes some parameters and a progress listener and returns a result synchronously. /// </summary> /// <param name="parameters"></param> /// <param name="progressListener"></param> /// <returns></returns> public static SomeResult DoLongRunningThing(SomeParameters parameters, IProgress <SomeProgress> progressListener) { for (var i = 0; i < 10; i++) { progressListener.Report(new SomeProgress(i / 10m, $"Doing Step {i + 1} of 10")); Thread.Sleep(500); } return(new SomeResult($"{parameters.Foo} has been foobarred")); }
/// <summary> /// Takes some parameters and a progress listener and returns a result asynchronously. /// </summary> /// <param name="parameters"></param> /// <param name="progressListener"></param> /// <returns></returns> public static async Task <SomeResult> DoLongRunningThingAsync(SomeParameters parameters, IProgress <SomeProgress> progressListener) { for (var i = 0; i < 10; i++) { await Task.Run(() => Thread.Sleep(2000)); progressListener.Report(new SomeProgress(i / 10m, $"Doing Step {i + 1} of 10")); } return(new SomeResult($"{parameters.Foo} has been foobarred")); }
/// <summary> /// Creates and starts a job using supplied parameters. /// </summary> /// <param name="parameters"></param> /// <returns></returns> public Job <SomeResult, SomeProgress> DoJobAsync(SomeParameters parameters) { // Set up each job to invoke the library method var job = new Job <SomeResult, SomeProgress>(Guid.NewGuid().ToString(), progressListener => { return(Library.DoLongRunningThingAsync(parameters, progressListener)); }); // Add it to repository so we can get it later this.repository.Add(job); // Start job now, but don't wait for it to finish job.Start(); return(job); }