1 октября 2017
Возможности C#
В предыдущих версиях С# асинхронные методы могли возвращать только типы 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();
}
}