Ручное выполнение HttpContext.Server.Execute: «блокировать при ожидании завершения асинхронной операции». ошибка - PullRequest
0 голосов
/ 14 февраля 2020

Я пытаюсь заставить работать приведенный ниже код. Я знаю, что, вероятно, я делаю то, что вам не следует делать, но у меня нет выбора. Мне нужно визуализировать страницу с пользовательским элементом управления, полностью из кода в обработчике http. Это прекрасно работает, когда не выполняется asyn c операций. Но как только я добавляю асинхронную операцию c (это требует некоторых усилий при реализации IHttpAsyncHandler, потому что не существует простого способа включить "asyn c" для страницы исключительно из кода), у меня возникают проблемы. Ошибка:

InvalidOperationException: HttpServerUtility.Execute заблокирован во время ожидания завершения асинхронной операции.

Кто-нибудь может мне объяснить:

  • Почему я получаю это
  • Почему обычная страница asyn c, отображаемая при вызове aspx в браузере, не выдает эту ошибку
  • Что я могу изменить, чтобы это исправить?

    using System;
    using System.Threading.Tasks;
    using System.Web;
    using System.Web.UI;
    
    namespace AsyncWebTest
    {
        public class Test : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            using (var objStringWriter = new System.IO.StringWriter())
            using (var objWriter = new HtmlTextWriter(objStringWriter))
            {
                context.Handler = new MyPage();
                context.Server.Execute(context.Handler, objWriter, false);
            }
        }
    
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    
        public class MyPage : Page, IHttpAsyncHandler
        {
            public MyPage()
            {
                AsyncMode = true;
                Controls.Add(new UserControlTest());
            }
    
            public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
            {
                return AsyncPageBeginProcessRequest(context, cb, extraData);
            }
    
            public void EndProcessRequest(IAsyncResult result)
            {
                AsyncPageEndProcessRequest(result);
            }
        }
    
        public class UserControlTest : UserControl
        {
            UserControlTest()
            {
                this.Load += Page_Load;
            }
    
            private async Task TestAsync()
            {
                await Task.Delay(100);
            }
    
            protected void Page_Load(object sender, EventArgs e)
            {
                base.Page.RegisterAsyncTask(new PageAsyncTask(TestAsync));
            }
        }
    }
    

    }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...