Envolviendo ManualResetEvent como tarea pendiente

Me gustaría esperar en un evento de restablecimiento manual con tiempo de espera y observación de la cancelación. Se me ha ocurrido algo como abajo. El objeto de evento de restablecimiento manual es proporcionado por una API fuera de mi control. ¿Hay alguna manera de hacer que esto suceda sin asumir y bloquear un hilo de ThreadPool?

static Task<bool> TaskFromWaitHandle(WaitHandle mre, int timeout, CancellationToken ct)
{
    return Task.Run(() =>
    {
        bool s = WaitHandle.WaitAny(new WaitHandle[] { mre, ct.WaitHandle }, timeout) == 0;
        ct.ThrowIfCancellationRequested();
        return s;
    }, ct);
}

// ...

if (await TaskFromWaitHandle(manualResetEvent, 1000, cts.Token))
{
    // true if event was set
}
else 
{
    // false if timed out, exception if cancelled 
}

[Editado] Aparentementetiene sentido usarRegisterWaitForSingleObject. Lo probaré.

Respuestas a la pregunta(2)

Su respuesta a la pregunta