corefx 源码学习:SqlClient 是如何同步建立 Socket 连接的
在昨天的技术周会上发现 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 连接的相关推荐
- Java并发包源码学习系列:同步组件CountDownLatch源码解析
文章目录 CountDownLatch概述 使用案例与基本思路 类图与基本结构 void await() boolean await(long timeout, TimeUnit unit) void ...
- 菜鸟系列Fabric源码学习 — 区块同步
Fabric 1.4 源码分析 区块同步 时光小说网 www.youxs.org 本文主要从源码层面介绍fabric peer同步区块过程,peer同步区块主要有2个过程: 1)peer组织的lead ...
- 以太坊源码学习 -- EVM
以太坊源码学习 – EVM 学习文档链接:here 一.虚拟机外 主要功能: 执行前将Transaction类型转化成Message,创建虚拟机(EVM)对象,计算一些Gas消耗,以及执行交易完毕后创 ...
- ASP.NET Core 源码学习之 Options[3]:IOptionsSnapshot
2017-06-28 更新: OptionsSnapshot 已改为 OptionsManager 变更详情 IOptionsCache 已改为 IOptionsMonitorCache 变更详情 在 ...
- JDK源码学习之Arraylist与LinkedList
ArrayList和LinkedList是我们在开发过程中常用的两种集合类,本文将从底层源码实现对其进行简单介绍. 下图是Java集合类所涉及的类图. 一.ArrayList 从上面的集合类图可以看出 ...
- JDK源码学习笔记——Enum枚举使用及原理
一.为什么使用枚举 什么时候应该使用枚举呢?每当需要一组固定的常量的时候,如一周的天数.一年四季等.或者是在我们编译前就知道其包含的所有值的集合. 利用 public final static 完全可 ...
- RocketMQ源码学习
RocketMQ源码学习 文章目录 RocketMQ源码学习 Producer 是怎么将消息发送至 Broker 的? 同步发送 异步发送 队列选择器 事务消息 原理 Broker 是怎么处理客户端发 ...
- RocketMQ 源码学习笔记 Producer 是怎么将消息发送至 Broker 的?
RocketMQ 源码学习笔记 Producer 是怎么将消息发送至 Broker 的? 文章目录 RocketMQ 源码学习笔记 Producer 是怎么将消息发送至 Broker 的? 前言 项目 ...
- 【Android 源码学习】SharedPreferences 源码学习
第一章:SharedPreferences 源码学习 文章目录 第一章:SharedPreferences 源码学习 Android SharedPreferences的缺陷 MMKV.Jetpack ...
最新文章
- java短横线转驼峰_第二讲:Java的运作原理
- business man
- [系统集成] CI持续集成项目简介
- php mysql 秒杀_redis+PHP实现高并发下秒杀数据入库的问题
- opencv 实现图像形态学操作 膨胀和腐蚀 开闭运算 形态学梯度 顶帽和黑帽
- 随机抽样之蓄水池算法
- 高等数学18讲(19版)反常积分的计算与敛散性判别
- 20个常用模拟电路(详细分析)
- visio对齐连接线
- vant组件做表格_有赞团队的vant ui组件库van-field使用
- ubuntu下破解rar文件的密码
- 吴裕雄--天生自然 诗经:望海潮·东南形胜
- sqlserver排序规则介绍以及修改
- 一篇文章让你看懂信息安全领域的巨鳄(小白必看)
- Verilog语言入门
- 网络协议篇之SNMP协议(二)—— 管理信息库MIB及OID
- anistropic filer
- Win2000XP服务与后门技术
- 单例模式的几种实现方式详解以及原理
- Arthas(阿尔萨斯)的基本使用