微软发布 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

文章推荐

深入浅出 OkHttp 源码解析及应用实践

JavaWeb 中 Filter过滤器

AutoGPT:有手就会的安装教程

理解Java程序的执行

垃圾回收之G1收集过程

c#动态执行字符串脚本(优化版)

Centos防火墙和端口操作

json-diff简单使用

线程池 - ThreadPoolExecutor源码分析

Ubuntu 18.04.4 安装docker18.09

boost::bind 不能处理函数重载 (error: no matching functio...

《回炉重造 Java 基础》——集合(容器)