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
的用法。
考虑到您在重试之前有一个计时器 运行,我也会考虑在您每次重试时打开连接,而不是在线程休眠时保持打开的连接。
我正在尝试编写一种方法,当某些数据库(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
的用法。
考虑到您在重试之前有一个计时器 运行,我也会考虑在您每次重试时打开连接,而不是在线程休眠时保持打开的连接。