博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在同步方法中调用异步方法时如何避免死锁问题
阅读量:5366 次
发布时间:2019-06-15

本文共 825 字,大约阅读时间需要 2 分钟。

这是在将 memcached 客户端 EnyimMemcached 迁移至 .Net Core 遇到的问题。

在 MemcachedClient 的构造函数中创建 socket 连接池时,有一个将主机名解析为 IP 地址的操作,之前调用的是同步的 System.Net.Dns.GetHostEntry() 方法,但在 .NET Core 中只有异步的 System.Net.Dns.GetHostAddressesAsync() 方法,所以被迫改为这样调用:

var addresses = System.Net.Dns.GetHostAddressesAsync(host).Result;

结果只要使用 EnyimMemcached 的 ASP.NET Core 站点在 Linux 上一运行,多个请求进来,就发生死锁(deadlock)。从浏览器端看,请求发出后,就一直处于等待状态。

不管改为:

var addresses = GetHostAddressesAsync(host).ConfigureAwait(false).GetAwaiter().GetResult();

还是改为:

var addresses = await Task.Run(async () => { return await System.Net.Dns.GetHostAddressesAsync(host); });

都会发生死锁。

你也许会说,干脆将上层调用方法都改成异步的,但是最上层是 MemcachedClient 的构造函数,没法改为异步的。如果真要将创建 socket 连接池的操作改为异步的,需要对 EnyimMemcached 的代码进行大动作。

目前还是打算直接在同步方法中调用异步方法,所以请教一下大家看有没有什么法子避开死锁?

转载于:https://www.cnblogs.com/yecao8888/p/5893418.html

你可能感兴趣的文章
一次PHP代码上线遇到的问题
查看>>
显示密码
查看>>
实现one hot encode独热编码的两种方法
查看>>
ubuntu中文英文环境切换
查看>>
[sql]mysql启停脚本
查看>>
[elk]Mutate filter plugin增删改查字段
查看>>
Java内功心法,行为型设计模式
查看>>
向github项目push代码后,Jenkins实现其自动构建
查看>>
jquery中的ajax方法参数的用法和他的含义
查看>>
BZOJ 1226: [SDOI2009]学校食堂Dining
查看>>
数组去重的几种方法
查看>>
包装类的自动装箱与拆箱
查看>>
ShareSDk的使用
查看>>
android使用web加载网页的js问题
查看>>
libvirt log系统分析
查看>>
poj 1068 Parencodings
查看>>
docker 数据卷管理
查看>>
adb
查看>>
Apache Tomcat部署java web项目
查看>>
转泛型
查看>>