For a windows service, I would be more inclined to use Asynchronous programming,
async
&
await
. Here is a mock working example for you, with cancellation built in, that was built as a DotNetCore 6.0 console app:
Job.cs
namespace TaskCompletionSourceDemo;
internal class Job
{
private TaskCompletionSource<bool>? tcs;
public Task StartJobAsync(CancellationToken token = default)
{
tcs = new TaskCompletionSource<bool>();
Task task = LongTask(token);
return tcs.Task;
}
private async Task LongTask(CancellationToken token = default)
{
await Task.Delay(5000, token).ConfigureAwait(false);
if (token.IsCancellationRequested)
{
tcs!.TrySetCanceled();
return;
}
tcs!.TrySetResult(!token.IsCancellationRequested);
}
}
Program.cs
using TaskCompletionSourceDemo;
Job job = new();
Console.WriteLine("Before Job!");
CancellationTokenSource cancelSource = new();
Task task = job.StartJobAsync(cancelSource.Token);
while (!task.IsCompleted)
{
if (Console.KeyAvailable && cancelSource.Token.CanBeCanceled)
{
cancelSource.Cancel();
Console.WriteLine("** Cancelled!");
break;
}
}
Console.WriteLine("After Job!");
Hope this helps!