Почему так глупо реализованы async интерфейсы?
От: john_silver  
Дата: 09.07.04 10:24
Оценка: 22 (2)
Почему [out] параметры передаются только в Finish_ вызовах?

Допустим, у меня имеется вызов Read(ULONG count, [out, size_is (count)] ULONG* buffer)
В асинхронном интерфейсе он выглядит так:
Begin_Read(ULONG count);
Finish_Read(ULONG* buffer);

Предположим, я пишу асинхронный сервер. По вызову Begin_Read, я, вроде бы, должен начать асинхронную операцию чтения данных в буфер пользователя. Но, блин, я еще не знаю адрес этого буфера! Так что, придется выделять временный буфер, читать туда, а по Finish_Read копировать его в буфер пользователя. Офигенно эффективно кто-то придумал!

С [in, out] параметрами еще хуже. Они передаются два раза, один раз в Begin_, а второй раз — в Finish_ методе. И, естественно, никто не гарантирует, что будут переданы одинаковые значения. Это тоже "толково" кто-то придумал, спасибо ему, мать-перемать.

Неужели не дотумкали до простой вещи: ВСЕ параметры, как входные, так и выходные, надо передавать в Begin_ методе, а Finish_ метод должен только возвращать код завершения? Не было бы проблем ни с [out], ни с [in. out], и вообще, Finish можно было оставить один на все методы интерфейса.

Ведь так сделано умными людьми во многих других системах. ASPI, например, и других, где используются асинхронные операции.

Ну почему этим уродам надо все делать обязательно в извращенной форме?

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.