/// <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);
        }