ОК, вот проблема: атрибут Async предназначен для случая, когда ваша страница будет вызывать какую-то длительную задачу, которая также блокирует поток, а затем вашей странице потребуется вывод этой задачи, чтобы вернуть информацию в Пользователь. Например, если вашей странице нужно было вызвать веб-службу, дождитесь ее ответа, а затем используйте данные из ответа для отображения вашей страницы.
Причина, по которой вы используете атрибут Async, состоит в том, чтобы избежать блокировки потока. Это важно, потому что приложения ASP.NET используют пул потоков для обслуживания запросов, и доступно только относительно небольшое количество потоков. И если каждый вызов связывает поток во время ожидания вызова веб-службы, то вскоре вы попадете на достаточное количество одновременно работающих пользователей, и пользователям придется ждать, пока эти вызовы веб-службы не завершатся. Атрибут Async позволяет потоку возвращаться в пул потоков и обслуживать других одновременных посетителей вашего веб-сайта, а не заставлять его сидеть неподвижно, ничего не делая, ожидая возврата вызова веб-службы.
Результат для вас таков: атрибут Async предназначен для случая, когда вы не можете отобразить страницу до тех пор, пока асинхронная задача не завершится, и поэтому она не отображает страницу немедленно.
Вам нужно запустить свой собственный поток и сделать его потоком демона. Я не помню точный синтаксис для этого, но вы можете легко найти его в документе, выполнив поиск в документе BCL для "daemon". Это означает, что поток будет препятствовать завершению работы вашего приложения, пока оно активно, что важно, потому что ASP.NET и IIS оставляют за собой право «перерабатывать ваш процесс», когда они сочтут это необходимым, и если это происходит во время работы вашего потока, Ваша задача будет остановлена. Создание демона потока предотвратит это (за исключением некоторых возможных редких крайних случаев ... вы узнаете больше, когда найдете документацию по этому вопросу).
В этом потоке демонов вы начнете выполнять эти задачи. И после того, как вы попросили поток демонов выполнить задание, вы можете немедленно визуализировать свою страницу ... так что визуализация страницы произойдет немедленно.
Однако даже лучше, чем поток демона в вашем процессе ASP.NET, реализовать службу Windows для выполнения этой задачи. Пусть ваше приложение ASP.NET сообщит о задаче, которая должна быть выполнена Сервису. Нет необходимости в потоке демона и не нужно беспокоиться о том, что ваш процесс ASP.NET может быть переработан. Как вы говорите Службе выполнить задачу? Возможно, через WCF или вставив запись в таблицу базы данных, которую служба опрашивает. Или ряд других способов.
РЕДАКТИРОВАТЬ: Вот еще одна идея, которую я использовал ранее для этой же цели. Запишите информацию о своей задаче в очередь MSMQ. Пусть другой процесс (возможно, даже на другом компьютере) извлечет из этой очереди и выполнит трудоемкую задачу. Задание по вставке в очередь оптимизировано так, чтобы оно возвращалось как можно быстрее, поэтому ваш поток не будет блокироваться, пока данные, помещенные в очередь, отправляются по проводам или что-то в этом роде. Это один из самых быстрых способов отметить тот факт, что задачу необходимо выполнить, не дожидаясь ее выполнения.