有哪些免费做简历的网站,中国建设招标网网站首页,装修公司网站建设方案,毕业设计做网站用什么软件C#多线程异步连接MySQL与SQLserver数据库 一、前言二、多线程异步连接数据库代码2.1代码块2.2代码说明 参考文档 一、前言
当编写代码连接多台设备上的数据库时#xff0c;如果采用同步逐个连接的方式#xff0c;在网络畅通的情况下连接速度尚可#xff0c;但当其中一台设备… C#多线程异步连接MySQL与SQLserver数据库 一、前言二、多线程异步连接数据库代码2.1代码块2.2代码说明 参考文档 一、前言
当编写代码连接多台设备上的数据库时如果采用同步逐个连接的方式在网络畅通的情况下连接速度尚可但当其中一台设备网络不佳特别是处于关机状态时等待数据库连接同时程序无法响应的时间会大幅度增加即使设置Connect Timeout也无法缩短等待时间因为此时是程序在等待TCP应答等待时间通常是由 TCP 协议本身的机制控制。
考虑到此类异常情况的处理可以使用多线程连接技术使用线程控制连接超时问题而异步连接可以在进行连接的同时进行其他操作。
二、多线程异步连接数据库代码
2.1代码块
private async Task(bool isSuccess, string message) TryConnectWithTimeoutAsync(object conn, int timeout)
{Stopwatch sw new Stopwatch();bool connectSuccess false;string message ;// 创建取消令牌源CancellationTokenSource cancellationTokenSource new CancellationTokenSource();CancellationToken token cancellationTokenSource.Token;// 创建连接任务Task connectTask Task.Run(() {try{sw.Start();if(conn is SqlConnection){((SqlConnection)conn).Open();}if (conn is MySqlConnection){((MySqlConnection)conn).Open();}connectSuccess true;message 数据库连接成功;}catch (Exception ex){message $数据库连接失败:{ex.Message};}}, token);// 创建超时任务Task timeoutTask Task.Delay(timeout, token);// 等待连接任务或超时任务哪个先完成Task completedTask await Task.WhenAny(connectTask, timeoutTask);if (completedTask timeoutTask){// 如果超时先完成取消连接任务cancellationTokenSource.Cancel();message 数据库连接超时;}return (connectSuccess, message);
}public async Task ConnectMultipleDatabasesAsync(int timeout, ListMySqlConnection mySqlConnections)
{var tasks new ListTask();for (int i 0; i mySqlConnections.Count; i){tasks.Add(TryConnectWithTimeoutAsync(mySqlConnections[i], timeout));}var results await Task.WhenAll(tasks); // 等待所有任务完成for (int i 0; i results.Length; i){var (isSuccess, message) results[i];Console.WriteLine(${message});}
}2.2代码说明
上面代码定义了两个异步执行的函数TryConnectWithTimeoutAsync和ConnectMultipleDatabasesAsync。TryConnectWithTimeoutAsync支持MySQL数据库连接和SQLserver数据库连接返回Tuple类型描述数据库连接情况执行单个数据库连接任务。 ConnectMultipleDatabasesAsync接受多个数据库连接对象输入内部调用TryConnectWithTimeoutAsync进行多个数据库连接任务timeout参数控制每个连接任务超时单位为毫秒。
实际使用时可通过如下代码进行ConnectMultipleDatabasesAsync调用
public async void UserFunc(ListMySqlConnection mySqlConnections)
{await Task.Run(async () {await ConnectMultipleDatabasesAsync(mySqlConnections, 5000);//超时等待5000毫秒});
}参考文档
C# 测试SqlServer连接及设置连接超时时间 C# 控制连接超时处理方法-连接数据库与连接网络路径超时情况