在昨天的技术周会上发现 EnyimMemcached 中建立 Socket 连接的代码有问题,今天坐车的时候在手机上阅读 .net core 2.2 的 SqlClient 中同步建立 Socket 连接的代码 SNITcpHandle.cs#L180  学习了一下。

建立 Socket 连接需要处理2个问题:1)处理连接失败的问题;2)处理连接超时的问题。

SNITcpHandle 中这样处理连接失败的,如果 Connected 为 false ,就 dispose 当前 socket ,代码如下:

sockets[i].Connect(ipAddresses[i], port);if (sockets[i] != null) // sockets[i] can be null if cancel callback is executed during connect(){if (sockets[i].Connected)    {        availableSocket = sockets[i];break;    }else    {        sockets[i].Dispose();        sockets[i] = null;    }}

连接超时的处理,SNITcpHandle 是借助 CancellationTokenSource 实现的

CancellationTokenSource cts = new CancellationTokenSource();cts.CancelAfter(timeout);void Cancel(){for (int i = 0; i < sockets.Length; ++i)    {try        {if (sockets[i] != null && !sockets[i].Connected)            {                sockets[i].Dispose();                sockets[i] = null;            }        }catch { }    }}cts.Token.Register(Cancel);

第一次见到在同步方式中使用 CancellationTokenSource ,而且神奇地解决了检测连接超时以及在超时发生时 dispose socket 的问题。

从中学到了 CancellationTokenSource 可以当作更简单的定时器来使用,在博问中写了段简单的代码验证了一下,详见 C# 中的 CancellationTokenSource 有什么用 。

原文地址:https://www.cnblogs.com/dudu/p/10778505.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 

corefx 源码学习:SqlClient 是如何同步建立 Socket 连接的相关推荐

  1. Java并发包源码学习系列:同步组件CountDownLatch源码解析

    文章目录 CountDownLatch概述 使用案例与基本思路 类图与基本结构 void await() boolean await(long timeout, TimeUnit unit) void ...

  2. 菜鸟系列Fabric源码学习 — 区块同步

    Fabric 1.4 源码分析 区块同步 时光小说网 www.youxs.org 本文主要从源码层面介绍fabric peer同步区块过程,peer同步区块主要有2个过程: 1)peer组织的lead ...

  3. 以太坊源码学习 -- EVM

    以太坊源码学习 – EVM 学习文档链接:here 一.虚拟机外 主要功能: 执行前将Transaction类型转化成Message,创建虚拟机(EVM)对象,计算一些Gas消耗,以及执行交易完毕后创 ...

  4. ASP.NET Core 源码学习之 Options[3]:IOptionsSnapshot

    2017-06-28 更新: OptionsSnapshot 已改为 OptionsManager 变更详情 IOptionsCache 已改为 IOptionsMonitorCache 变更详情 在 ...

  5. JDK源码学习之Arraylist与LinkedList

    ArrayList和LinkedList是我们在开发过程中常用的两种集合类,本文将从底层源码实现对其进行简单介绍. 下图是Java集合类所涉及的类图. 一.ArrayList 从上面的集合类图可以看出 ...

  6. JDK源码学习笔记——Enum枚举使用及原理

    一.为什么使用枚举 什么时候应该使用枚举呢?每当需要一组固定的常量的时候,如一周的天数.一年四季等.或者是在我们编译前就知道其包含的所有值的集合. 利用 public final static 完全可 ...

  7. RocketMQ源码学习

    RocketMQ源码学习 文章目录 RocketMQ源码学习 Producer 是怎么将消息发送至 Broker 的? 同步发送 异步发送 队列选择器 事务消息 原理 Broker 是怎么处理客户端发 ...

  8. RocketMQ 源码学习笔记 Producer 是怎么将消息发送至 Broker 的?

    RocketMQ 源码学习笔记 Producer 是怎么将消息发送至 Broker 的? 文章目录 RocketMQ 源码学习笔记 Producer 是怎么将消息发送至 Broker 的? 前言 项目 ...

  9. 【Android 源码学习】SharedPreferences 源码学习

    第一章:SharedPreferences 源码学习 文章目录 第一章:SharedPreferences 源码学习 Android SharedPreferences的缺陷 MMKV.Jetpack ...

最新文章

  1. java短横线转驼峰_第二讲:Java的运作原理
  2. business man
  3. [系统集成] CI持续集成项目简介
  4. php mysql 秒杀_redis+PHP实现高并发下秒杀数据入库的问题
  5. opencv 实现图像形态学操作 膨胀和腐蚀 开闭运算 形态学梯度 顶帽和黑帽
  6. 随机抽样之蓄水池算法
  7. 高等数学18讲(19版)反常积分的计算与敛散性判别
  8. 20个常用模拟电路(详细分析)
  9. visio对齐连接线
  10. vant组件做表格_有赞团队的vant ui组件库van-field使用
  11. ubuntu下破解rar文件的密码
  12. 吴裕雄--天生自然 诗经:望海潮·东南形胜
  13. sqlserver排序规则介绍以及修改
  14. 一篇文章让你看懂信息安全领域的巨鳄(小白必看)
  15. Verilog语言入门
  16. 网络协议篇之SNMP协议(二)—— 管理信息库MIB及OID
  17. anistropic filer
  18. Win2000XP服务与后门技术
  19. 单例模式的几种实现方式详解以及原理
  20. Arthas(阿尔萨斯)的基本使用

热门文章

  1. Java并发包--线程池框架
  2. Android帧缓冲区(Frame Buffer)硬件抽象层(HAL)模块Gralloc的实现原理分析(2)...
  3. I/O多路转接之poll——基于TCP协议
  4. 关于ubuntu 14.04 dpkg 问题
  5. 【转载】Android设计中的.9.png
  6. 树莓派:3安装NodeJS
  7. django与easyui使用过程中遇到的问题
  8. C#使用NPOI导出Excel文件
  9. SingnalR 开发到生产部署闭坑指南
  10. 浅谈C#更改令牌ChangeToken