Я бы хотел подождать в ручном мероприятии reset с тайм-аутом и отменой аннулирования. Я придумал что-то вроде ниже. Ручной объект события reset предоставляется API, находящимся под моим контролем. Есть ли способ сделать это без принятия и блокировки потока из 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
}
[EDITED] По-видимому, имеет смысл использовать RegisterWaitForSingleObject
. Я попробую.