public static Task<bool> ToTask(this WaitHandle waitHandle, TimeSpan? maxValue = null)
{
var tcs = new TaskCompletionSource<bool>();
// Registering callback to wait till WaitHandle changes its state
WaitOrTimerCallback callBack = (o, timeout) =>
{
tcs.SetResult(!timeout);
};
ThreadPool.RegisterWaitForSingleObject(waitHandle, callBack, null,
maxValue ?? TimeSpan.MaxValue, true);
return tcs.Task;
}