AsyncCTP: создание класса, который является IAwaitable - PullRequest
3 голосов
/ 18 июля 2011

Я обнаружил, что хочу реализовать класс IAwaitable (то, что реализует асинхронные вызовы без блокировки потоков).

У меня установлена ​​последняя версия AsyncCTP, и компилятор говорит, что мне нужен член IsCompleted ().Итак, предварительный просмотр CTP немного продвинулся (я понимаю, что это предварительный просмотр)

Вопрос: Какой интерфейс ожидают расширения языка AsyncCTP сейчас ?

Вопрос: Во всем этом я предполагаю, что могу сигнализировать "IAwaitable" через lamda / делегат?Это возможно?Мы называем EndAwait?Intellisense предполагает, что вы вызываете EndAwait для получения результата ... так что это не звучит правильно.Есть идеи?

Все примеры, которые я нашел до сих пор, относятся к функциям, которые уже реализована в библиотеке AsyncCTP, например:

  await new WebClient().DownloadStringTaskAsync(uri).ConfigureAwait(false);

из 101 AsyncSamplesCS

Справочная информация:

Я нахожусь на странице Джона Скитса (снова), просматривая этот пример

using System;

class Test
{
    static async void Main()
    {
        await new Awaitable();
    }
}

class Awaitable
{
    public Awaiter GetAwaiter()
    {
        return new Awaiter();
    }
}

class Awaiter
{
    public bool BeginAwait(Action continuation)
    {
        return false;
    }

    public int EndAwait()
    {
        return 1;
    }
}

1 Ответ

4 голосов
/ 18 июля 2011

При обновлении SP1 вам потребуется:

  • Какой-то GetAwaiter() метод (возможно, но не обязательно метод расширения), который возвращает что-то (Awaiter в вашем примере) со всеми из:
    • A bool IsCompleted свойство (get)
    • A void OnCompleted(Action callback)
    • A GetResult() метод, который возвращает void или желаемый результат ожидаемой операции

Тем не менее, я предлагаю вам взглянуть на TaskCompletionSource<T> - Я смотрел на это, и это превзошло мой наивныйреализация ( здесь; устаревшая ).Вы также можете использовать его для void задач, используя что-то вроде TaskCompletionSource<bool> (и использовать тот факт, что Task<bool> также является нетипизированным Task).

...