淮安網(wǎng)站排名優(yōu)化公司自助建站系統(tǒng)哪個好
C#多線程異步連接MySQL與SQLserver數(shù)據(jù)庫
- 一、前言
- 二、多線程異步連接數(shù)據(jù)庫代碼
- 2.1代碼塊
- 2.2代碼說明
- 參考文檔
一、前言
當編寫代碼連接多臺設備上的數(shù)據(jù)庫時,如果采用同步逐個連接的方式,在網(wǎng)絡暢通的情況下連接速度尚可,但當其中一臺設備網(wǎng)絡不佳特別是處于關(guān)機狀態(tài)時,等待數(shù)據(jù)庫連接同時程序無法響應的時間會大幅度增加,即使設置Connect Timeout也無法縮短等待時間,因為此時是程序在等待TCP應答,等待時間通常是由 TCP 協(xié)議本身的機制控制。
考慮到此類異常情況的處理,可以使用多線程連接技術(shù),使用線程控制連接超時問題,而異步連接可以在進行連接的同時進行其他操作。
二、多線程異步連接數(shù)據(jù)庫代碼
2.1代碼塊
private async Task<(bool isSuccess, string message)> TryConnectWithTimeoutAsync(object conn, int timeout)
{Stopwatch sw = new Stopwatch();bool connectSuccess = false;string message = "";// 創(chuàng)建取消令牌源CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();CancellationToken token = cancellationTokenSource.Token;// 創(chuàng)建連接任務Task connectTask = Task.Run(() =>{try{sw.Start();if(conn is SqlConnection){((SqlConnection)conn).Open();}if (conn is MySqlConnection){((MySqlConnection)conn).Open();}connectSuccess = true;message = "數(shù)據(jù)庫連接成功";}catch (Exception ex){message = $"數(shù)據(jù)庫連接失敗:{ex.Message}";}}, token);// 創(chuàng)建超時任務Task timeoutTask = Task.Delay(timeout, token);// 等待連接任務或超時任務哪個先完成Task completedTask = await Task.WhenAny(connectTask, timeoutTask);if (completedTask == timeoutTask){// 如果超時先完成,取消連接任務cancellationTokenSource.Cancel();message = "數(shù)據(jù)庫連接超時";}return (connectSuccess, message);
}public async Task ConnectMultipleDatabasesAsync(int timeout, List<MySqlConnection> mySqlConnections)
{var tasks = new List<Task>();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代碼說明
上面代碼定義了兩個異步執(zhí)行的函數(shù),TryConnectWithTimeoutAsync和ConnectMultipleDatabasesAsync。TryConnectWithTimeoutAsync支持MySQL數(shù)據(jù)庫連接和SQLserver數(shù)據(jù)庫連接,返回Tuple類型描述數(shù)據(jù)庫連接情況,執(zhí)行單個數(shù)據(jù)庫連接任務。
ConnectMultipleDatabasesAsync接受多個數(shù)據(jù)庫連接對象輸入,內(nèi)部調(diào)用TryConnectWithTimeoutAsync,進行多個數(shù)據(jù)庫連接任務,timeout參數(shù)控制每個連接任務超時,單位為毫秒。
實際使用時,可通過如下代碼進行ConnectMultipleDatabasesAsync調(diào)用:
public async void UserFunc(List<MySqlConnection> mySqlConnections)
{await Task.Run(async () =>{await ConnectMultipleDatabasesAsync(mySqlConnections, 5000);//超時等待5000毫秒});
}
參考文檔
C# 測試SqlServer連接及設置連接超時時間
C# 控制連接超時處理方法-連接數(shù)據(jù)庫與連接網(wǎng)絡路徑超時情況