Есть ли способ использовать Task в качестве дескриптора ожидания для будущего значения T?

Я бы хотел использовать возврат задачи из метода, чтобы вернуть значение, когда оно станет доступным позже, чтобы вызывающий мог либо заблокировать с помощью Wait, либо присоединить продолжение, либо даже дождаться его. Лучшее, о чем я могу думать, это следующее:

 public class Future<T> {
    private ManualResetEvent mre = new ManualResetEvent();
    private T value;
    public async Task<T> GetTask() {
        mre.WaitOne();
        return value;
    }
    public void Return(T value) {
        this.value = value;
        mre.Set();
    }
}

Основная проблема в том, что mre.WaitOne () блокируется, поэтому я предполагаю, что каждый вызов GetTask () будет планировать новый поток для блокировки. Есть ли способ ожидания WaitHandle в асинхронном режиме или уже есть помощник для создания эквивалентной функциональности?

Edit: Хорошо, TaskCompletionSource то, что я ищу, и я просто усложняю себе жизнь?

7
задан svick 9 March 2013 в 23:40
поделиться