Я просто наткнулся кодирование параллелизма на asp.net и нашел там 2 способа, чтобы вызвать метод асинхронного в методе Page_Loadв ASP.NET последовательность выполнения асинхронных задач
- RegisterAsyncTask (новый PageAsyncTask (DoSthAsync())) ;
- Ожидание DoSthAsync();
Однако они имеют разные результаты работы. Для случая 1 код сразу после RegisterAsyncTask будет запускаться непосредственно перед любым кодом в DoSthAsync(). Пока код после ждет будет запущен по завершении DoSthAsync().
Например:
//protected async void Page_Load(object sender, EventArgs e)
protected void Page_Load(object sender, EventArgs e)
{
Response.Write("Start</br>");
Response.Flush();
RegisterAsyncTask(new PageAsyncTask(DoSthAsync()));
//await DoSthAsync();
Response.Write("End</br>");
Response.Flush();
}
public async Task LoadSomeData()
{
await Task.Delay(1000);
Response.Write("Do Sth Async</br>");
Response.Flush();
}
Этот фрагмент кода будет генерировать следующий результат:
Start
End
Do Sth Async *(after 1 second delay)*
В то время как я раскомментировать ждут DoSthAsync() код и комментарии RegisterAsyncTask, следующий результат будет показано на рисунке.
Start
Do Sth Async *(after 1 second delay)*
End
В статье Рик Андерсон Using Asynchronous Methods in ASP.NET 4.5, он предложил использовать RegisterAsyncTask даст лучший контроль над исполнением кода. Тем не менее, это дает неожиданный результат, который я ищу в ожидании в page_load, будет генерировать идентичный, поскольку я пытаюсь использовать аналогичную последовательность кода в программе Windows.
В своей статье у Рика также есть код запуска секундомера перед запуском GetPWGsrvAsync() после того, как весь асинхронный код завершен, показывая, как долго выполняется код. Он показывает, прошедшее время составляет 0,872 с в крышке экрана. Поэтому ожидается, что секундомер будет остановлен после того, как весь предыдущий код, включая все в асинхронном методе, будет завершен.
.......
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
RegisterAsyncTask(new PageAsyncTask(DoSthAsync()));
//await DoSthAsync();
stopWatch.Stop();
Response.Write(String.Format("Elapsed time:{0}",stopWatch.Elapsed.Milliseconds/1000.0));
Response.Write("</br>");
Response.Flush();
.......
В то время как я следую его таким же образом, как фрагмент кода выше, у меня есть другой результат в любом RegisterAsyncTask или ждут DoSthAsync(). Хотя Истекшее время отображаются в разных положениях, они оба дают мне очень короткое истекшее время около 0,010 или 10 + мс, и считается, что секундомер остановлен очень быстро после асинхронной функции DoSthAsync() уволен. Фактически, аналогичный результат в оконной программе тоже очень скоро прекратился.
После подробного описания проблемы я хотел бы спросить, какой способ асинхронного кодирования иметь лучший контроль и шаблон кода. Между тем, как я мог ожидать результата секундомера, чтобы дать мне точное время прохождения кода.
Я также полагаю, что вы должны прочитать следующую статью Скотта Hanselmann по этой теме: http://www.hanselman.com/blog/TheMagicOfUsingAsynchronousMethodsInASPNET45PlusAnImportantGotcha.aspx –
@ManuelZelenka Я прочитал эту статью, тоже, но у него есть нет никакого упоминания о различии между RegisterAsyncTask и ждать. он просто упомянул «Использование async с пустотами не является стабильным или надежным. Однако все, что вам нужно сделать, это вызвать страницу. RegisterAyncTask - это не проблема, и вы будете в более гибком месте». Это то же самое, что я упоминал в статье Рика. И его пример просто имеет одно действие в Page_Load. – Donald
Да, я использую RegisterAsyncTask давно, а asp.net 2.0. Это просто немного сложно, когда он используется с новым ожиданием async. Последовательность выполнения кода является неожиданной.В статье Рика «Методы, связанные с RegisterAsyncTask, будут выполняться сразу после PreRender». Итак, образец, который я написал выше, означает, что DoSthAsync() фактически не запущен в Page_Load? – Donald