Я пытаюсь заставить работать приведенный ниже код. Я знаю, что, вероятно, я делаю то, что вам не следует делать, но у меня нет выбора. Мне нужно визуализировать страницу с пользовательским элементом управления, полностью из кода в обработчике 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));
}
}
}
}