Я пытаюсь обернуть некоторые существующие вызовы APM (BeginX
, EndX
) в Tasks
, чтобы получить все их преимущества.К сожалению, наши методы неординарны и используют параметры out
и поэтому не могут использовать стандартный метод FromAsync
, в котором вы предоставляете ему как начальный, так и конечный делегаты и позволяете ему красиво обернуть его.
В этой статье описывается альтернатива: перегрузка, которая принимает IAsyncResult
и требует только реализации обратного обратного вызова.Они берут дескриптор IAsyncResult
, затем ждут его завершения, а затем вызывают делегата, которого вы передали.
Это выглядело нормально, но потом я прочитал еще одну статью об упаковке вызовов APM в задачи ,Он также упоминает, что перегрузка IAsyncResult
не так эффективна, как другие методы.Мне кажется, что это означает, что обратный вызов не используется, чтобы сообщить о завершении метода.Это означает, что они должны использовать AsyncWaitHandle
или опрос IsCompleted
.Какой из них они используют?Сколько это снижает производительность?
Если он выполняет опрос, это означает, что обратный вызов может прийти не сразу, и им придется активно проверять его в течение всего вызова.Если у них есть AsyncWaitHandle
, у них есть другой поток, который ожидает и ожидает результата, что полностью лишает меня смысла использовать асинхронный метод.
Кто-нибудь знает, что они делают и каксуровое ли это снижение производительности?