首页 > 解决方案 > ASP.NET Web 窗体中的异步方法

问题描述

我必须在 ASP.NET Web 表单应用程序中使用第三方库。

我必须使用的第三方方法是异步方法。

由于我必须在页面点击事件处理程序中调用它,我有 2 个选项:

  1. 将必须使用此方法的每个页面声明为 <%@ Page Async="true" ... %>
  2. 同步调用方法。

第一个问题

仅为此方法声明所有网站页面异步是否有意义(可能可以在每个页面上调用)?

第二个问题

第二个问题是关于同步调用异步方法。

必须调用以下方法

async Task<bool> MyMethodAsync()
{
    ...
}

接下来的 3 次调用之间有什么区别?

Task.Run(async () => await MyMethodAsync()).GetAwaiter().GetResult();
Task.Run(() => MyMethodAsync()).GetAwaiter().GetResult();
MyMethodAsync().GetAwaiter().GetResult();

在执行过程中我看不出有什么不同……</p>

谢谢!

标签: c#asp.net

解决方案


Task.Run(async () => await MyMethodAsync()).GetAwaiter().GetResult();

这将启动一个任务以在异步运行该方法的线程池线程上运行。然后主线程坐在那里等待线程池线程任务完成。

Task.Run(() => MyMethodAsync()).GetAwaiter().GetResult();

这与上面的相同,但是在方法完全完成之前主函数“继续”。

MyMethodAsync().GetAwaiter().GetResult();

这至少避免了使用额外的线程来停止主线程。

编辑:我没有看到这个问题:

仅为此方法声明所有网站页面异步是否有意义(可能可以在每个页面上调用)?

要看是什么样的async。如果他们仍然返回 void,那么您将一无所获,您只是在破坏您的代码库。如果您要返回实际的Task,那么可以确定。事实上,这就是 ASP.Net Core 的工作方式。


推荐阅读