c# - 继续尝试通过 Func<T> 连接到服务器 - 但 SqlConnection 参数保持为空

c# - keep trying to connect to Server through Func<T> - but SqlConnection parameter stays null

我正在尝试编写一种方法,当某些数据库(SQL-服务器)相关的东西第一次失败时 "tries again"。作业完成(或失败)后,应关闭给定的连接。

但是在 finally 块中,连接对象保持为 NULL,不应该有对调用者连接对象的引用吗?我也尝试了非静态方法,结果相同。

为什么连接(在 KeepTrying::Run 中)总是空的?

这里是简化的代码:

using System;
using System.Data.SqlClient;
class Program
{
    static void Main(string[] args)
    {
        DBManager.CreateConnection();
        Console.ReadKey();
    }
}

public static class DBManager
{
    public static SqlConnection Connection;
    public static bool CreateConnection()
    {
        String error = String.Empty;
        bool result = KeepTrying.Run(() => _CreateConntection(), Connection, out error);
        return result;
    }
    private static bool _CreateConntection()
    {
        Connection = new SqlConnection("Data Source=SERVERNAME;Initial Catalog=DATABASENAME;user=USER;password=PASSWORD;");
        Connection.Open();
        return true;
    }
}

public static class KeepTrying
{
    public static T Run<T>(Func<T> method, SqlConnection connection, out String ErrorMessage)
    {
        ErrorMessage = String.Empty;
        int maxAttempts = 3;
        int time = 435;
        int attempts = 0;
        bool error = true;
        while (error && attempts < maxAttempts)
        {
            attempts++;
            try
            {
                T result = method();
                return result;
            }
            catch (Exception ee)
            {
                ErrorMessage = ee.Message;
                error = true;
                if (attempts < maxAttempts)
                    System.Threading.Thread.Sleep(time);
                else
                    return default(T);
            }
            finally
            {
                if (connection != null)  //connection is still null here
                    connection.Close();
            }
        }
        return default(T);
    }
}

调用run时不会设置连接,Connection的静态空实例将被传递到方法中,然后在调用_CreateConnection时替换,传递给方法的实例将保持为空。虽然我不相信这种模式,但如果您忽略将连接传递到方法中并始终引用静态连接,它可能会起作用。还可以考虑在使用一次性物品时查找 using 的用法。

考虑到您在重试之前有一个计时器 运行,我也会考虑在您每次重试时打开连接,而不是在线程休眠时保持打开的连接。