c# - ASP.NET Web 窗体中的异步方法
问题描述
我必须在 ASP.NET Web 表单应用程序中使用第三方库。
我必须使用的第三方方法是异步方法。
由于我必须在页面点击事件处理程序中调用它,我有 2 个选项:
- 将必须使用此方法的每个页面声明为 <%@ Page Async="true" ... %>
- 同步调用方法。
第一个问题
仅为此方法声明所有网站页面异步是否有意义(可能可以在每个页面上调用)?
第二个问题
第二个问题是关于同步调用异步方法。
必须调用以下方法
async Task<bool> MyMethodAsync()
{
...
}
接下来的 3 次调用之间有什么区别?
Task.Run(async () => await MyMethodAsync()).GetAwaiter().GetResult();
Task.Run(() => MyMethodAsync()).GetAwaiter().GetResult();
MyMethodAsync().GetAwaiter().GetResult();
在执行过程中我看不出有什么不同……</p>
谢谢!
解决方案
Task.Run(async () => await MyMethodAsync()).GetAwaiter().GetResult();
这将启动一个任务以在异步运行该方法的线程池线程上运行。然后主线程坐在那里等待线程池线程任务完成。
Task.Run(() => MyMethodAsync()).GetAwaiter().GetResult();
这与上面的相同,但是在方法完全完成之前主函数“继续”。
MyMethodAsync().GetAwaiter().GetResult();
这至少避免了使用额外的线程来停止主线程。
编辑:我没有看到这个问题:
仅为此方法声明所有网站页面异步是否有意义(可能可以在每个页面上调用)?
要看是什么样的async
。如果他们仍然返回 void,那么您将一无所获,您只是在破坏您的代码库。如果您要返回实际的Task
,那么可以确定。事实上,这就是 ASP.Net Core 的工作方式。
推荐阅读
- sql - PostgreSQL 查询到 JOIN 和 SUM
- elasticsearch - ElasticSearch 通用 url 仅 10 项返回
- c# - 如何在 Cake 中使用 dotnetcoretest 将测试结果上传到 AppVeyor
- google-sheets - 尝试在 Google 表格中设置查询并使用标题作为标签加入结果
- .net - `dotnet run` 与 `dotnet publish`
- perforce - 如何删除旧的 Perforce 工作区而不破坏我在新工作区下对完全相同的文件所做的工作?
- java - Java Number Randomizer 的输出为 null
- mysql - 有没有办法计算 MySQL 列中的所有尾随零?
- c# - 镜像PNG图像设置为黑色透明 - 任何解决方案?
- python - 我如何判断 vmware 上的 pyvmomi 造成的压力是什么?