corefx 源码学习:SqlClient 是如何同步建立 Socket 连接的
在昨天的技術(shù)周會(huì)上發(fā)現(xiàn) EnyimMemcached 中建立 Socket 連接的代碼有問題,今天坐車的時(shí)候在手機(jī)上閱讀 .net core 2.2 的 SqlClient 中同步建立 Socket 連接的代碼?SNITcpHandle.cs#L180? 學(xué)習(xí)了一下。
建立 Socket 連接需要處理2個(gè)問題:1)處理連接失敗的問題;2)處理連接超時(shí)的問題。
SNITcpHandle 中這樣處理連接失敗的,如果?Connected 為 false ,就 dispose 當(dāng)前 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;
}
}
連接超時(shí)的處理,SNITcpHandle 是借助?CancellationTokenSource 實(shí)現(xiàn)的
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 ,而且神奇地解決了檢測連接超時(shí)以及在超時(shí)發(fā)生時(shí) dispose socket 的問題。?
從中學(xué)到了?CancellationTokenSource 可以當(dāng)作更簡單的定時(shí)器來使用,在博問中寫了段簡單的代碼驗(yàn)證了一下,詳見?C# 中的 CancellationTokenSource 有什么用?。
原文地址:https://www.cnblogs.com/dudu/p/10778505.html
.NET社區(qū)新聞,深度好文,歡迎訪問公眾號(hào)文章匯總?http://www.csharpkit.com?
總結(jié)
以上是生活随笔為你收集整理的corefx 源码学习:SqlClient 是如何同步建立 Socket 连接的的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: asp.net core 3.0 gRP
- 下一篇: NetCore + SignalR 实现