首页 > 编程语言 >asp.net 应用程序中同步方法调用异步方法无响应解决方法

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

时间:2023-03-28 17:58:36浏览次数:41  
标签:异步 asp return GetString await async net 方法 public

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

发生些问题的具体条件

  1. asp.net 应用程序(控制台无法重现,winform、wpf 没有尝试过)
  2. 同步方法里面调用异步方法直接通过Result属性获取方法返回值
  3. 在被调用的异步方法里面肯定会发生新的线程执行异步任务

上案例(asp.net webapi)

public class TodoController : ApiController
{
    protected async Task<string> GetString()
    {
        return await new HttpClient().GetStringAsync("https://www.cnblogs.com");
    }

    public string GetTodo()
    {
        return GetString().Result;
    }
}

上述代码中当GetTodo被调用时就会出现长时间的等待。

解决方案 A

public class TodoController : ApiController
{
    protected async Task<string> GetString()
    {
        return await new HttpClient().GetStringAsync("https://www.cnblogs.com");
    }

    public string GetTodo()
    {
        return Task.Factory.StartNew(() => GetString()).Unwrap().GetAwaiter().GetResult();
    }
}

解决方案 B

添加包Nito.AsyncEx

using Nito.AsyncEx;

public class TodoController : ApiController { protected async Task<string> GetString() { return await new HttpClient().GetStringAsync("https://www.cnblogs.com"); } public string GetTodo() { return AsyncContext.Run(() => GetString()); } }

 

标签:异步,asp,return,GetString,await,async,net,方法,public
From: https://www.cnblogs.com/jekon/p/17266131.html

相关文章

  • Go语言中本地包的嵌套调用方法
    最近学习区块链,在使用Go语言的过程中遇到本地包之间相互调用的问题,问题分为两个阶段:1.如何调用本地包(参考文章:https://blog.csdn.net/taoerchun/article/details/10482770......
  • 毕业论文数据分析方法分类汇总
    今天将常用的数据分析方法进行一个分类汇总说明,整理如下图:1、基本描述统计基本描述统计分析包括频数分析、描述分析、分类汇总;是对收集的数据进行基本的说明。频数分......
  • Raspberry Pi上手笔记之一
    RaspberryPi上手笔记之一作者:chszs RaspberryPi在国内称为“树莓派”,在开始使用树莓派之前,我们需要熟悉它的连接器和功能。这有助于我们选择使用树莓派来实现什么项目,也......
  • Loki日志聚合分析系统-kubernetes
    Promtail介绍Loki是GrafanaLabs团队最新的开源项目,是一个水平可扩展,高可用性,多租户的日志聚合系统。它的设计非常经济高效且易于操作,因为它不会为日志内容编制索引,而......
  • Javascript 加密解密方法
    本文链接Javascript和我之前发的python加密以及go加密解密不一样不需要导那么多的库只需要安装几个库其中需要了解最多的crypto-js具体就不多介绍了直接上官......
  • 【Android逆向】定位native函数在哪个so中方法
    1.在逆向过程中经常需要定位方法在哪个so中,而app加载的so很多,比如那么如何快速定位方法在哪里呢2.比如如下案例,首先看日志03-2811:01:56.4571456614566DKM-NATI......
  • 如何解决MySQL Connector NET xxxx无法卸载的问题(win10)
    使用PowerBI(以下简称PBI)的小伙伴想必都知道,想要在PBI连接MySQL数据库,必须安装MySQLconnectornet,我之前安装过MySQLconnectornet6.9.3,PBI是可以正常连接MySQL的,最近更......
  • java方法-数组(定义,声明创建)
    数组概述数组的定义数组是相同类型数据的有序集合数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成其中,每一个数据称作一个数组元素,每个数组元......
  • APP.net等引发网络信息发布新天地
    【编者按】RichardMacManus是国外科技博客ReadWriteWeb的创始人兼主编,他认为像App.net、Medium、Branch和Svbtle这类新产品将会为网络信息发布带来全新的一面,同时会给Twitt......
  • Vue子组件向父组件传值(this.$emit()方法)
    子组件使用this.$emit()向父组件传值首先必须在父组件中引用子组件,然后实现传值第一步在父组件中引入子组件 importUnitByPurchaseAddOrUpdatefrom'@views/module......