【发布时间】:2020-10-02 10:52:44
【问题描述】:
我需要从 asp.net webforms 按钮单击事件处理程序执行异步操作。我已阅读文档 Using Asynchronous Methods 和 What not to do in ASP.NET。第一个文档链接在Page_Load 中显示了PageAsyncTask,并且不包括点击事件等事件。第二个文档链接涵盖了我的情况。
- 我的网络表单声明为
Async="true"。 - 我的 web.config http 运行时设置为 dotnet 4.5
httpRuntime targetFramework="4.5"
这是我的按钮点击事件处理程序:
protected void DoAsync_Click(object sender, EventArgs e)
{
// This line executes
Page.RegisterAsyncTask(new PageAsyncTask(async () =>
{
// This line never executes
var stringToRead = "This line never executes";
using (StringReader reader = new StringReader(stringToRead))
{
var readText = await reader.ReadToEndAsync();
Result.Text = readText;
}
}));
// This line executes
HttpContext.Current.Response.Redirect(_someUrl, true);
}
我的问题是PageAsyncTask 任务中的代码永远不会执行。我在注册任务后尝试添加Page.ExecuteRegisteredAsyncTasks();,但它仍然没有执行。
我还尝试过将事件处理程序设置为 async void(不推荐)并以传统的 async/await 模式等待异步操作。这会导致 ThreadAbortedExceptions 并且无论如何都不是网络表单的推荐方法。
【问题讨论】:
-
尝试将整个执行放在一个 Task.Run() 构造中: var t = Task.Run(() => {...}) t.Wait();
-
这可以解决它,但它也会阻塞线程,这是我试图避免的。
-
如果您无条件重定向,异步执行此操作有什么意义?
-
这个例子不是真正的代码,它只是一个例子。真正的代码有几个数据库操作。关键是不要阻塞等待长时间运行的操作完成的线程。异步代码不是问题,问题是为什么它没有被执行。
标签: c# asp.net asynchronous async-await webforms