Завершение ManualResetEvent как ожидаемая задача

Я хотел бы дождаться события ручного сброса с тайм-аутом и наблюдением отмены. Я'Мы придумали что-то вроде ниже. Объект события ручного сброса предоставляется API вне моего контроля. Есть ли способ сделать это, не принимая и не блокируя поток из ThreadPool?

static Task 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 
}

[EDITED] Видимо, этоимеет смысл использоватьRegisterWaitForSingleObject, Я'попробую.

Ответы на вопрос(2)

Ваш ответ на вопрос