VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > temp > C#教程 >
  • asp.net 应用程序中同步方法调用异步方法无响应解决方法

微软发布 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());
    }
}
复制代码


 

出处:https://www.cnblogs.com/jekon/p/17266131.html

相关教程