tgstation-server  4.3.2
The /tg/station 13 server suite
JobHandler.cs
Go to the documentation of this file.
1 using System;
2 using System.Threading;
3 using System.Threading.Tasks;
4 
5 namespace Tgstation.Server.Host.Jobs
6 {
10  sealed class JobHandler : IDisposable
11  {
15  readonly CancellationTokenSource cancellationTokenSource;
16 
20  readonly Task task;
21 
26  public JobHandler(Func<CancellationToken, Task> job)
27  {
28  if (job == null)
29  throw new ArgumentNullException(nameof(job));
30  cancellationTokenSource = new CancellationTokenSource();
31  task = job(cancellationTokenSource.Token);
32  }
33 
35  public void Dispose() => cancellationTokenSource.Dispose();
36 
40  public int? Progress { get; set; }
41 
47  public async Task Wait(CancellationToken cancellationToken)
48  {
49  TaskCompletionSource<object> tcs = new TaskCompletionSource<object>();
50  using (cancellationToken.Register(() => tcs.SetCanceled()))
51  await Task.WhenAny(tcs.Task, task).ConfigureAwait(false);
52  cancellationToken.ThrowIfCancellationRequested();
53  }
54 
58  public void Cancel() => cancellationTokenSource.Cancel();
59  }
60 }
readonly Task task
The Task being run
Definition: JobHandler.cs:20
readonly CancellationTokenSource cancellationTokenSource
The CancellationTokenSource for task
Definition: JobHandler.cs:15
Class for pairing Tasks with CancellationTokenSources
Definition: JobHandler.cs:10
JobHandler(Func< CancellationToken, Task > job)
Construct a JobHandler
Definition: JobHandler.cs:26
async Task Wait(CancellationToken cancellationToken)
Wait for task to complete
Definition: JobHandler.cs:47