Нет жестких правил, но вот несколько рекомендаций для вас:
sync vs. async: используйте синхронизацию, когда у вас нет длительных задач. Используйте асинхронный, когда вы делаете. Например, если обработчик запрашивает базу данных или выполняет вызов веб-службы, он должен быть асинхронным.
generic против custom: используйте generic, если вам не важно расширение в URL (это будет * .ashx). Используйте custom, если расширение важно (возможно, для создания пользовательских изображений PNG). Полностью настраиваемые обработчики требуют дополнительного шага для их регистрации в web.config, но в остальном они практически идентичны универсальным обработчикам.
Кроме того, может быть полезно помнить, что класс Page на самом деле является просто HttpHandler, который обрабатывает файлы .aspx - и вы, конечно, также можете иметь страницы синхронизации и асинхронности с теми же рекомендациями, что и выше.
Если это интересно, я подробно опишу эту информацию в своей книге, включая примеры ( Сверхбыстрый ASP.NET ).