When using Tasks you could use a loop and check if the Task
.IsCompleted in the loop, this way you don't have to wait.
Task.IsCompleted Property (System.Threading.Tasks) | Microsoft Docs[
^]
I used this in a Windows service without any Async statements and about 20 simultaneous running Tasks (including long running tasks) for monitoring all kinds of things, and it works without any problems.
There is a nice series of articles on CodeProject about Tasks:
Task Parallel Library: 1 of n[
^]