タイムアウトとキャンセルを監視する手動リセット イベントを待ちたいと思います。私は以下のようなものを思いつきました。手動リセット イベント オブジェクトは、制御できない 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
}
[編集]どうやら、使用するのは理にかなっていますRegisterWaitForSingleObject
。やってみます。