Это стандартное программирование на основе интерфейса .
Возвращая IAsyncResult, платформа может изменить внутреннюю реализацию позднее, не нарушая код, написанный для API платформы. По сути, это говорит нам, как разработчикам, о том, что нам не важно, какой тип реализации используется, при условии соблюдения интерфейса (IAsyncResult).
Если вместо этого будет возвращен реальный класс AsyncResult, то переход на другой класс нарушит существующий код.
Кроме того, это позволяет платформе использовать один и тот же интерфейс (IAsyncResult) в нескольких местах, независимо от того, подходит ли класс AsyncResult. Я лично воспользовался этим, поскольку создал свои собственные асинхронные функции, которые возвращают IAsyncResult, поддерживаемый другим классом, в котором хранится информация, которая была важна для меня. Это позволяет моему собственному коду работать как фреймворк, не ограничивая меня реализацией фреймворка.