C# 7 – Обобщенные типы для значений возвращаемых асинхронно

C# logoВ предыдущих версиях С# асинхронные методы могли возвращать только типы void, Task или Task<T>. В C# 7 сделано обобщение: компилятор теперь может использовать любой тип, который поддерживает набор заданных методов и интерфейсов. Это позволит разработчикам создавать собственные типы для асинхронных методов.

Требования к возвращаемым типам

Тип, который можно использовать в асинхронном методе как возвращаемый, должен реализовывать метод

public TAwaiter GetAwaiter()

где TAwaiter это так же произвольный тип, который, в свою очередь, содержит:

  • свойство bool IsCompleted – сигнализирующее о том, что асинхронная операция завершена,
  • метод TResult GetResult() – возвращающий результат асинхронной операции
  • реализацию интерфейса INotifyCompletion – позволяет определять последующие действия после завершения операции.

Тип, созданный для возврата из асинхронного метода, может быть как классом, так и структурой.

В коде это может выглядеть следующим образом:

public struct CustomAsyncResult<TResult>
{
    public CustomAwaiter<TResult> GetAwaiter()  { … }
}

public struct CustomAwaiter<TResult> : INotifyCompletion
{
    public bool IsCompleted { get; }

    public void OnCompleted(Action continuation) { … }

    public TResult GetResult() { … }
}

// Пример применения созданного типа
public class UsageDemo
{
    // Асинхронный метод, возвращающий CustomAwaiter<TResult>
    public CustomAsyncResult<int> GetAsync()
    {
        CustomAsyncResult<int> result = new CustomAsyncResult<int>();
        return result;
    }

    // Пример вызова
    public async Task Demo()
    {
        int result = await this.GetAsync();
    }
}

Добавить комментарий