翼度科技»论坛 编程开发 .net 查看内容

asp.net 应用程序中同步方法调用异步方法无响应解决方法

3

主题

3

帖子

9

积分

新手上路

Rank: 1

积分
9
微软发布 C# async/await 异步语法功能已经好久了,但是目前来看使用并不广泛。本人经过实践在开发过程中使用 async/await 一路到底确实很爽,而且也没有啥问题。但是在面对旧项目变更要使用些功能的时候可能会遇到同步方法调用异步方法的情况,本人在这种情况就发生调用没有响应的问题,并作些总结。
发生些问题的具体条件

  • asp.net 应用程序(控制台无法重现,winform、wpf 没有尝试过)
  • 同步方法里面调用异步方法直接通过Result属性获取方法返回值
  • 在被调用的异步方法里面肯定会发生新的线程执行异步任务
上案例(asp.net webapi)
  1. public class TodoController : ApiController
  2. {
  3.     protected async Task<string> GetString()
  4.     {
  5.         return await new HttpClient().GetStringAsync("https://www.cnblogs.com");
  6.     }
  7.     public string GetTodo()
  8.     {
  9.         return GetString().Result;
  10.     }
  11. }
复制代码
上述代码中当GetTodo被调用时就会出现长时间的等待。
解决方案 A
  1. public class TodoController : ApiController
  2. {
  3.     protected async Task<string> GetString()
  4.     {
  5.         return await new HttpClient().GetStringAsync("https://www.cnblogs.com");
  6.     }
  7.     public string GetTodo()
  8.     {
  9.         return Task.Factory.StartNew(() => GetString()).Unwrap().GetAwaiter().GetResult();
  10.     }
  11. }
复制代码
解决方案 B
添加包Nito.AsyncEx
  1. using Nito.AsyncEx;<br><br>public class TodoController : ApiController
  2. {
  3.     protected async Task<string> GetString()
  4.     {
  5.         return await new HttpClient().GetStringAsync("https://www.cnblogs.com");
  6.     }
  7.     public string GetTodo()
  8.     {
  9.         return AsyncContext.Run(() => GetString());
  10.     }
  11. }
复制代码
 

来源:https://www.cnblogs.com/jekon/archive/2023/03/28/17266131.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具