zoukankan      html  css  js  c++  java
  • 在同步方法中调用异步方法时如何避免死锁问题

    这是在将 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 的代码进行大动作。
    目前还是打算直接在同步方法中调用异步方法,所以请教一下大家看有没有什么法子避开死锁?

  • 相关阅读:
    1.1.9 如何从正文开始设置页眉页脚
    1.1.8 怎样在Word的页眉中插入一级标题
    1.1.5 在同一折线图中画2条曲线
    1.1.4 图片自动编号
    1.1.3 公式编号对齐
    1.1.2 一页摘要不分栏,正文分栏
    1.1.1 参考文献格式未满行直接换行
    kernel page_size
    kernel cpu_cur_freq
    kernel printk
  • 原文地址:https://www.cnblogs.com/yecao8888/p/5893418.html
Copyright © 2011-2022 走看看